2010-07-22 3 views
2

가능한 중복 :
How can I make the preprocessor insert linebreaks into the macro expansion result?C 프리 프로세서가 강제로 새로운 라인을 생성 할 수 있습니까?

#define IDENTIFIER { /*new line here*/\ 
      my_multiline(); /*new line here*/\ 
      macro(); /*new line here*/\ 
     } /*new line here*/ 

내가 그것을 확장 년대에 새로운 라인을 생성하는 C 사전 프로세서를 강제로 할 수 있나요? 나는 이것을하기위한 표준 방법이 있다고 생각하지 않지만 Visual C++ (2008) 및 gcc에 대한 특정 플랫폼 해킹을 염두에 두지 않을 것입니다.

m4 또는 별도의 전처리기를 통해이 작업을 수행하는 데 관심이 없습니다.

이유는이 부탁 해요 :

그것은 더 많거나 적은 단지 호기심입니다. 그것은 해킹이기 때문에 이것을 프로덕션에서 시도하지는 않겠지 만 어쨌든 이것을 할 수 있는지 알고 싶습니다. 며칠 전 나는이 질문에 발견 : 이것은 해결책에게 자신을하고 싶은 질문이다

Can you turn off (specific) compiler warnings for any header included from a specific location?

. 나는 헤더를 포함하기위한 매크로를 만드는 것에 대해 생각했지만, 포함하기 전에 경고를 사용하지 않도록하는 올바른 pragma를 사용하여 경고를 끄고 싶은 헤더를 포함시키고, include 후에 경고를 사용하도록 설정했습니다.

물론 경고 및 포함을위한 pragma와 함께 mock includes를 생성하는 스크립트를 만들 수 있습니다.

내 첫 번째 문제점은 #include이 사전 프로세서 지침이므로 매크로를 생성하는 데 다소 쓸모가 없다는 것이 었습니다. 이와

Is there a way to do a #define inside of another #define?

나는 나는 그것이 확장의에서 개행 문자를 생성하는 컴파일러를 강제 할 수있어 경우에 특별한 매크로를 포함 생성 할 수 있다고 생각 :하지만 나는이 대답을 발견했다.

저는 지금 집에 있지만 내일 직장에있을 때 제 코드를 게시 할 것입니다.

+1

'# define'에는 식별자가 필요합니다. 그리고 어쨌든 공백이 어떤 용도로 사용됩니까? 확장 된 코드는 절대 보지 못합니다. – GManNickG

+0

@GMan : 그는 아마도 매크로 자체를 더 읽기 쉽게하려고합니다. – CookieOfFortune

+3

왜 그렇게하고 싶은지에 대한 배경 지식을 줄 수 있습니까? 작성하려는 특정 매크로가 있습니까? 어쩌면 문제에 대한 다른 해결책이있을 수 있습니다. –

답변

6

디버거에서 코드를 읽기 쉽게하려는 경우 #defined 매크로 대신 inline 함수를 사용할 수 있습니다. 안타깝게도 인라인 키워드는 C에 추가 된 C99이며 ANSI C (MSVC와 같은)의 독점 확장에서만 지원됩니다.

#if __STDC_VERSION__ < 199901L 
# if defined(_MSC_VER) 
# define inline __inline 
# elseif defined(__GNUC__) 
# define inline __inline__ 
# endif 
#endif 

static inline void IDENTIFIER() { 
    my_multiline(); 
    macro(); 
} 

이렇게하면 유형을 검사 할 때 (일반적으로 오류가 적게 발생 함) 이점이 있습니다.

+1

매크로를 행복하게하지 마십시오. 후회할 것입니다. 잠깐. 후회하지는 않지만 유지 보수 프로그래머는 코드에 손가락을 대고 있던 날을 저주 할 것입니다. :) –

+0

@C 존슨 :이 경우 "유지 보수 프로그래머"가 자신이 아니라면. –

+0

인라인에 +1 ... 나는 대답에있는 #define에서 마지막 "d"를 좋아하지 않았다 ;-) – KedarX

관련 문제