코드 입력포스트그레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);