수색…


비고

제약은 기존의 모든 C 사양 (최근 ISO-IEC 9899-2011)에서 사용 된 용어입니다. 그것들은 표준의 6 절에 설명 된 언어의 세 부분 중 하나입니다 (옆 구문과 의미에 따라).

ISO-IEC 9899-2011에서는 제약 조건을 다음과 같이 정의합니다.

제한, 구문 적 또는 의미 적, 언어 요소의 설명이 해석되어야 함

(C 표준의 관점에서, "런타임 제약"은 일종의 제약이 아니며 광범위하게 다른 규칙을 가지고 있습니다.)

다른 말로하면 제약은 문법적으로 유효한 다른 프로그램을 불법으로 만드는 언어의 규칙을 기술합니다. 이 점에서 제약 조건은 정의되지 않은 동작과 다소 유사합니다. 따라 가지 않는 프로그램은 C 언어로 정의되지 않습니다.

반면 제약 조건은 정의되지 않은 동작과 매우 큰 차이가 있습니다. 즉, 제약 조건이 위반 된 경우 번역 단계 (컴파일의 일부)에서 진단 메시지를 제공하기위한 구현이 필요합니다.이 메시지는 경고이거나 컴파일을 중단시킬 수 있습니다.

같은 범위에 중복 된 변수 이름

C 표준에서 표현 된 제약 조건의 예는 범위 1 에서 선언 된 동일한 이름의 두 변수를 갖는 것입니다. 예를 들면 다음과 같습니다.

void foo(int bar)
{
    int var;
    double var;
}

이 코드는 제약 조건을 위반하고 컴파일시 진단 메시지를 생성해야합니다. 이는 프로그램이 실행되기 전에 개발자가 문제를 알게 될 가능성이 있으므로 정의되지 않은 동작과 비교할 때 매우 유용합니다.

제약 조건은 이와 같이 컴파일 시간에 쉽게 감지 할 수있는 오류가되는 경향이 있습니다. 정의되지 않은 동작을 초래하지만 컴파일 시간에 감지하기 어렵거나 불가능한 문제는 제약 사항이 아닙니다.


1) 정확한 표현 :

C99

식별자에 링키지가없는 경우, 6.7.2.3에 규정 된 태그를 제외하고 동일한 범위와 같은 이름 공간에서 (선언자 또는 형식 지정자에) 식별자를 한 번만 선언해야합니다.

단항 산술 연산자

단항 +- 연산자는 산술 유형에서만 사용할 수 있습니다. 따라서 예를 들어 struct에서 구조체를 사용하려고하면 프로그램에서 진단을 생성합니다. 예 :

struct foo
{
    bool bar;
};

void baz(void)
{
   struct foo testStruct;
   -testStruct; /* This breaks the constraint so must produce a diagnostic */
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow