C 언어에서 매크로 정의 (#define) 시do{}while (0) 의 가치
1. 코드의 적응성 증가
다음 매크로 정의는 do 를 사용하지 않았습니다.while(0)
#define FOO(x) foo(x); bar(x);
이렇게 매크로를 정의하면 개별적으로 호출해도 문제가 발생하지 않습니다. 예를 들어,
FOO(100)
매크로를 확장하면 다음이 됩니다.
foo(x);bar(x);
이렇게 FOO를 호출하는 것은 아무런 문제가 없지만 FOO (x) 는 제어문에 넣을 수 없습니다. 예를 들어
if (condition)
FOO(x);
else
...;
매크로 확장 후
if (condition)
foo(x);bar(x);
else
...;
이렇게 해서 문법 오류를 초래했다. 문법 오류는 무섭지 않다. 컴파일 단계에서 발견할 수 있다. 더욱 치명적인 것은 그가 논리 오류를 초래할 수 있다는 것이다. 이런 오류를 컴파일러가 발견할 수 없다. 이런 문제가 발생하면 프로그래머는 미치겠지.예를 들면 다음과 같습니다.
if (condition)
FOO(x);
이 코드는 다음과 같이 확장됩니다.
if (condition)
foo(x); bar(x);
이렇게 하면 condition이true든false든bar(x)는 모두 호출됩니다.이 고생한 형제 없나요?
이때while(0)의 가치가 구현되었습니다. FOO의 정의를 수정하십시오.
#define FOO(x) do { foo(x); bar(x); } while (0)
이렇게 FOO를 제어문에 넣으면 문제가 없다.
아마도 누군가가 말하기를:foo(x);bar(x)는 괄호로 묶으면 되지 않습니까?예를 들어 다음과 같이 정의합니다.
#define FOO(x) { foo(x); bar(x); }
다음 코드를 다시 보십시오.
if (condition)
FOO(x);
else
...;
확장:
if (condition)
{foo(x);bar(x);} ; // ,
else
...;
그대로 문법이 틀렸다.
2. 코드의 확장성 증가
내가 이해하는 확장성은 주로 매크로 정의에서 다른 매크로를 인용할 수 있다는 것이다. 예를 들어 다음과 같다.
#define FOO(x) do{OTHER_FOO(x)} while(0)
OTHER_FOO ,
3. 코드의 유연성 증가
유연성은 주로 우리가 매크로에서break를 나올 수 있다는 데 나타난다. 예를 들어 다음과 같은 정의가 있다.
#define FOO(x) do{ \
foo(x); \
if(condition(x)) \
break; \
bar(x) \
..... \
} while(0)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.