C 전 처리기에서 메시지를 인쇄하는 이식 가능한 방법이 있습니까?


99

나는 다음과 같은 것을 할 수 있기를 원합니다.

#print "C Preprocessor got here!"

디버깅 목적으로. 이 작업을 수행하는 가장 좋은 / 가장 이식 가능한 방법은 무엇입니까?

답변:


114

warning지시문은 아마도 여러분이 얻을 수있는 가장 가까운 것일 수 있지만 완전히 플랫폼 독립적 인 것은 아닙니다.

#warning "C Preprocessor got here!"

AFAIK는 pragma지시문 을 사용해야하는 MSVC를 제외한 대부분의 컴파일러에서 작동 합니다.

#pragma message ( "C Preprocessor got here!" )

5
어느 것이 문제가 되는가? 컴파일 플래그를 기반으로 지시문을 넣어 "pragma message"와 "warning"을 어떻게 든 바꿀 수 있습니까? 예를 들면 다음과 같습니다. #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... 나는 그것을 시도해야하지만 본능적으로 대답은 '아니오'라고 말합니다.
Bryan

11
@Bryan : 네. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner 2011 년

1
#pragma message ()는 이전 버전의 gcc (예 : RHEL5의 기본 버전 인 gcc 4.1.2)에서 지원되지 않습니다. 나는 이러한 이전 버전에 대해 적절한 상응하는 것을 아직 찾지 못했습니다. 경고는 일반적으로 우리에게 오류로 취급되기 때문에 #warning은 좋지 않을 것입니다. 그리고 우리는 컴파일을 중지하기보다는 메시지가 정보 용이되기를 바랍니다.
Danny S

6
프로젝트가 기본적으로 -Wall로 컴파일 될 때 경고를 발행하는 것은 매우 불편합니다. #pragma 메시지에는 문제가 없습니다.
Renan Gemignani

56

다음은 MSVCGCC에서 지원됩니다 .

#pragma message("stuff")
#pragma message "stuff"

Clang은 최근에 지원을 추가하기 시작했습니다 . 자세한 내용은 여기 를 참조 하세요 .


3
참고로 Solaris Studio 12.3 (Sun C 5.12)은이 pragma를 지원하지 않습니다.
maxschlepzig 2013 년

Visual Studio vMicro를 사용하여 Arduino 1.8에서 작동합니다. 감사!
save_jeff

12

시도해 볼 수 있습니다. #pragma message("Hello World!")


9

대부분의 C 컴파일러는 #warning지시문 을 인식 하므로

 #warning "Got here"

표준 '#error'지시문도 있습니다.

 #error "Got here"

모든 컴파일러가이를 지원하지만 컴파일 / 전처리도 중지됩니다.


6
#pragma message("foo")

잘 작동합니다. -Werror를 사용해도 컴파일을 멈추지 않습니다.


0

또 다른 해결책은 주석과 쉘 스크립트를 사용하여 처리하는 것입니다. 이것은 약간의 규율 (또는 오타를 포착하는 쉘 스크립트)을 필요로합니다.

예를 들어, 형식화 된 주석을 추가 한 //TODO다음 모든 주석을 보고서로 수집하는 쉘 스크립트를 추가합니다.

더 복잡한 사용 사례의 경우 자신 만의 간단한 전처리기를 작성할 수 있습니다. 예를 들어 소스를 *.c2파일 로 편집 할 수 있습니다. 간단한 전처리 기는 소스를 읽고를 찾고 출력 파일에 //TODO씁니다 .printf("TODO ...")*.c


-17

당신은 할 수 없습니다. 전처리 기는 C 코드보다 먼저 처리됩니다. 전 처리기 코드가 실행되지 않기 때문에 화면에 인쇄 할 전 처리기 지시문이 없습니다. 실행 코드로 컴파일 될 C 코드를 생성하는 데 사용됩니다.

문제가있는 경우 :

#ifdef ...
printf("Hello");
#endif

이것은 전처리 기가가는 한 할 수있는 전부이기 때문입니다.


5
이것은 컴파일 타임에 인쇄되지 않으며 OP가 찾고 있다고 생각하는 것입니다.
Bob Kaufman

나는 그가 런타임에 인쇄를 의미한다고 생각했습니다.
Alexander Rafferty

1
나는 컴파일 타임에 대해 물었다. 감사!
Andrew Wagner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.