2010-04-07 4 views
-1

매크로 이름을 아무 것도 선언하지 않았다고 가정하면 xyz()입니다.C에서 매크로가 .... 솔루션을 제공하십시오

이제 다른 매크로 xyz1()을 만들고 첫 번째 매크로, 즉 xyz()을 2 번째로 참조합니다.

마지막으로 다른 매크로 xyz2()을 만들고 세 번째 매크로를 참조합니다.

지금 제 질문은 : 올바른 것입니까? (문제없이 실행 중입니까?) 매크로 xyz()이 두 번 정의되었습니다. 왜 오류를주지 않는가? 해결 방안은 무엇인가?

+1

이것은 어떤 종류의 끔찍한 해킹처럼 들리지만 ... 나중에 코드를 유지해야하는 사람을 대신하여이 작업을 수행하지 마십시오. – Amber

+3

일부 코드를 표시하십시오. 설명에서'xyz'를 한 번만 선언하는 것처럼 들립니다. –

+4

'xyz'가 왜 두 번 정의 되었습니까? 당신의 설명에 따르면'xyz','xyz1','xyz2'를 한번 만들고 있습니다. – Vlad

답변

2

아니요, 첫 번째 매크로는 한 번만 정의 할 수 있습니다. 당신이

#define Symbol SymbolResolution 

를 작성하는 경우가 Symbol을 볼 때마다 처리기는 SymbolResolution에 대한 Symbol을 대체합니다. SymbolResolution#define 인 경우 또는 내부에 #define 개의 기호가 포함 된 일부 기호가 포함 된 경우 모두 교체됩니다. 이는 전체 번역 단위에서 기호가 #define 인 기호가 없을 때까지 발생합니다.

다른 매크로의 매크로를 원하는대로 참조 할 수 있습니다. 그러나 매크로를 재귀 적으로 참조 할 수는 없습니다. 또한 조심해야합니다. 매크로를 오용하면 코드를 쉽게 디버깅 할 수 없으며 쉽게 읽을 수 없게됩니다.

1

다른 매크로를 참조하는 매크로를 의미하는 경우 합법적입니다.

전처리 매크로 이름을 확장

이 매크로의 확장 매크로 호출을 대체, 다음 확장 확장에 더 많은 매크로 검사합니다.
#define hello() (12) 
#define test() (1+hello()) 

그러나 자신을 호출하는 매크로는 자체 참조 매크로 누구 이름의 정의에 나타납니다 하나입니다

법적 없습니다. 을 호출하면 모든 매크로 정의가 으로 바뀌어 더 많은 매크로를 바꿀 수 있습니다. 자체 참조가 매크로 사용으로 간주되면 무한히 큰 확장 인 을 생성합니다. 을 방지하려면 자체 참조는 매크로 호출로 간주되지 않는 입니다.

+1

도 정의 할 수 없습니다.'#define make_macro (x) #define macro_ ## x funcname ## x()'(임베디드 정의는 평가되지 않음). –

관련 문제