이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 54.4. 기타 코딩 토토 캔버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

53.4. 기타 코딩 사설 토토

C 표준

코드 입력포스트그레SQLC99 표준에서 사설 토토할 수 있는 언어 기능에만 의존해야 합니다. 이는 C99를 준수하는 컴파일러가 최소한 몇 가지 플랫폼 종속 부분을 제외하고 postgres를 컴파일할 수 있어야 함을 의미합니다.

C99 표준에 포함된 몇 가지 기능은 현재 코어에서 사용이 허용되지 않습니다.포스트그레SQL코드. 여기에는 현재 가변 길이 배열, 혼합된 선언 및 코드가 포함됩니다.//댓글, 범용 문자 이름. 그 이유에는 이식성과 역사적 관행이 포함됩니다.

폴백이 제공되는 경우 C 표준의 이후 개정판의 기능 또는 컴파일러 특정 기능을 사용할 수 있습니다.

예를 들어_Static_assert()그리고__builtin_constant_pC 표준의 최신 개정판에 속하더라도 현재 사용되고 있습니다.GCC확장자 각각. 사설 토토할 수 없는 경우 동일한 검사를 수행하지만 다소 비밀스러운 메시지를 내보내고 사설 토토하지 않는 C99 호환 대체품을 사설 토토합니다.__builtin_constant_p.

함수형 매크로 및 인라인 함수

인수를 포함한 두 매크로 및정적 인라인함수를 사설 토토할 수 있습니다. 매크로로 작성할 때 다중 평가 위험이 있는 경우 후자가 더 좋습니다(예:

#define Max(x, y) ((x)  (y) ? (x) : (y))

또는 매크로가 매우 긴 경우. 다른 경우에는 매크로만 사용하거나 최소한 더 쉽게 사용할 수 있습니다. 예를 들어 다양한 유형의 표현식을 매크로에 전달해야 하기 때문입니다.

인라인 함수의 정의가 백엔드의 일부로만 사설 토토할 수 있는 기호(예: 변수, 함수)를 참조하는 경우 프런트엔드 코드에 포함되면 함수가 표시되지 않을 수 있습니다.

#ifndef 프론트엔드
정적 인라인 MemoryContext
MemoryContextSwitchTo(MemoryContext 컨텍스트)

    MemoryContext old = CurrentMemoryContext;

    CurrentMemoryContext = 컨텍스트;
    늙어 돌아가다;

이 예에서는CurrentMemoryContext11261_11355#ifndef 프론트엔드. 이 사설 토토은 일부 컴파일러가 함수가 사용되지 않는 경우에도 인라인 함수에 포함된 기호에 대한 참조를 생성하기 때문에 존재합니다.

신호 처리기 작성

신호 처리기 코드 내에서 실행하기에 적합하려면 매우 신중하게 작성해야 합니다. 근본적인 문제는 차단되지 않는 한 신호 처리기가 언제든지 코드를 중단할 수 있다는 것입니다. 신호 처리기 내부의 코드가 외부 코드와 동일한 상태를 사용하면 혼란이 발생할 수 있습니다. 예를 들어, 신호 처리기가 중단된 코드에 이미 보유된 잠금을 획득하려고 시도하는 경우 어떤 일이 발생하는지 생각해 보세요.

신호 처리기의 특수 배열 코드를 금지하면 비동기 신호 안전 함수(POSIX에 정의된 대로)와 액세스 변수 유형만 호출할 수 있습니다.휘발성 sig_atomic_t. 몇 가지 기능포스트그레스또한 신호가 안전한 것으로 간주됩니다. 중요한 것은SetLatch().

대부분의 경우 신호 처리기는 신호가 도착했음을 기록하고 래치를 사용하여 처리기 외부에서 실행되는 코드를 깨우는 것 이상을 수행해야 합니다. 이러한 핸들러의 예는 다음과 같습니다.

정적 공허
handler_sighup(SIGNAL_ARGS)

    int save_errno = errno;

    got_SIGHUP = 사실;
    SetLatch(MyLatch);

    errno = save_errno;

errno다음 이유로 인해 저장 및 복원됩니다.SetLatch()변경될 수도 있습니다. 완료되지 않은 경우 현재 검사 중인 코드가 중단됩니다.errno잘못된 값이 표시될 수 있습니다.

함수 포인터 호출

명확성을 위해 포인터가 단순 변수인 경우 가리키는 함수를 호출할 때 함수 포인터를 명시적으로 역참조하는 것이 좋습니다. 예:

(*emit_log_hook) (eddata);

(그렇지만emit_log_hook(eddata)또한 작동합니다). 함수 포인터가 구조의 일부인 경우 추가 구두점은 일반적으로 생략될 수 있으며 생략되어야 합니다. 예를 들면 다음과 같습니다.

paramInfo-paramFetch(paramInfo, paramId);