2017-12-04 1 views
3

I came across 다음 코드 줄은 무엇이며 어떻게 처리되는지 알 수 없습니다.C에서 'switch 0'구문의 목적은 무엇입니까?

#define static_assert(a, b) do { switch (0) case 0: case (a): ; } while (0) 

switch (0) 부분의 기능은 무엇입니까? 0false과 같다고 가정하면 switch 문을 입력하지 않는다는 의미입니까?

또한 case (a) 행의 경우 알 수없는 a 변수를 사례로 제공 할 수 있습니까?

+3

이것은 'a'가 컴파일 타임 상수인지 확인하는 것입니다. 'b'도 사용되지 않습니다. 확장 된 코드는 실제로 아무 것도하지 않고 넘어집니다. 'switch (0)'는'switch (100)'또는 다른 어떤 값과 다르지 않다. 'case 0'으로 분기하고 거기에서부터 실행이 계속됩니다. 'a'는 변수가 아니어야합니다. 매크로에 전달하는 것은 무엇이든합니다. 상수 여야합니다. 변수를 전달하면 컴파일 타임 오류가 발생합니다. –

+3

['static_assert'] (https://stackoverflow.com/q/1647895/995714) 여기에 의도와 용도가 다르지만 그 이름이 좋은 선택이 아니더라도 약간의 힌트를 줄 수 있습니다. –

+3

표준 구현으로 불완전합니다 'static_assert'는 함수 밖에서 작동하지 않으므로 –

답변

5

switch(0)은 항상 case 0: 블록과 관련된 코드 블록을 실행합니다. 여전히 여기에는 실제로 실행 된 코드가 없습니다. 두 경우 모두 비어 있습니다. 명백한 표현 (a)이 확인되지 않은 경우 여기

점은 컴파일시에 컴파일러 화가 을하는 것입니다 :이 경우, 확장 된 매크로 두 case 0: 것 - 명시 적으로 제공 한, 그리고 하나를 그 선언 된 표현식의 결과를 사용합니다 (실패한 경우 0). 결과적으로 두 개의 동일한 case이있는 switch이 허용되지 않으며 컴파일 타임에 컴파일러가 오류로 중단됩니다.

전달 된 표현식이 컴파일시 평가되는 상수가 아닌 경우 (런타임에서 확인할 수 없으므로 case 값) 이는 또한 static_assert에서 예상됩니다.

관련 문제