C Language
제약 조건
수색…
비고
제약은 기존의 모든 C 사양 (최근 ISO-IEC 9899-2011)에서 사용 된 용어입니다. 그것들은 표준의 6 절에 설명 된 언어의 세 부분 중 하나입니다 (옆 구문과 의미에 따라).
ISO-IEC 9899-2011에서는 제약 조건을 다음과 같이 정의합니다.
제한, 구문 적 또는 의미 적, 언어 요소의 설명이 해석되어야 함
(C 표준의 관점에서, "런타임 제약"은 일종의 제약이 아니며 광범위하게 다른 규칙을 가지고 있습니다.)
다른 말로하면 제약은 문법적으로 유효한 다른 프로그램을 불법으로 만드는 언어의 규칙을 기술합니다. 이 점에서 제약 조건은 정의되지 않은 동작과 다소 유사합니다. 따라 가지 않는 프로그램은 C 언어로 정의되지 않습니다.
반면 제약 조건은 정의되지 않은 동작과 매우 큰 차이가 있습니다. 즉, 제약 조건이 위반 된 경우 번역 단계 (컴파일의 일부)에서 진단 메시지를 제공하기위한 구현이 필요합니다.이 메시지는 경고이거나 컴파일을 중단시킬 수 있습니다.
같은 범위에 중복 된 변수 이름
C 표준에서 표현 된 제약 조건의 예는 범위 1 에서 선언 된 동일한 이름의 두 변수를 갖는 것입니다. 예를 들면 다음과 같습니다.
void foo(int bar)
{
int var;
double var;
}
이 코드는 제약 조건을 위반하고 컴파일시 진단 메시지를 생성해야합니다. 이는 프로그램이 실행되기 전에 개발자가 문제를 알게 될 가능성이 있으므로 정의되지 않은 동작과 비교할 때 매우 유용합니다.
제약 조건은 이와 같이 컴파일 시간에 쉽게 감지 할 수있는 오류가되는 경향이 있습니다. 정의되지 않은 동작을 초래하지만 컴파일 시간에 감지하기 어렵거나 불가능한 문제는 제약 사항이 아닙니다.
1) 정확한 표현 :
식별자에 링키지가없는 경우, 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 */
}