56.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 = 컨텍스트;
    늙어 돌아가다;

이 예에서는CurrentMemoryContext11052_11146#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(edata)또한 작동합니다). 함수 포인터가 구조의 일부인 경우 추가 구두점은 일반적으로 생략될 수 있으며 생략되어야 합니다. 예를 들면 다음과 같습니다.

paramInfo-paramFetch(paramInfo, paramId);

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.