programing

C에서 댓글을 #정의할 수 있습니까?

lovejava 2023. 10. 16. 21:25

C에서 댓글을 #정의할 수 있습니까?

디버그 시스템을 하려고 하는데 작동이 안 되는 것 같습니다.

제가 이루고 싶었던 것은 다음과 같습니다.

#ifndef DEBUG
    #define printd //
#else
    #define printd printf
#endif

방법이 있습니까?디버그 메시지가 많아서 하기 싫습니다.

if (DEBUG)
    printf(...)

code

if (DEBUG)
    printf(...)

...

아니, 그럴 수 없다.주석은 전처리 지시사항 처리가 시작되기 전에 코드에서 제거됩니다.이러한 이유로 매크로에 주석을 포함할 수 없습니다.

또한 매크로 트릭을 사용하여 나중에 주석을 "형성"하려는 시도는 작동하지 않습니다.컴파일러는 "늦은" 코멘트를 코멘트로 인식할 필요가 없습니다.

원하는 것을 구현하는 가장 좋은 방법은 C99에서 변수 인수가 있는 매크로를 사용하는 것입니다(또는 컴파일러 확장자를 사용하는 것일 수도 있습니다).

일반적인 방법은 다음과 같습니다.

#ifdef DEBUG
  #define OUTPUT(x) printf x
#else
  #define OUTPUT(x)
#endif

#include <stdio.h>
int main(void)
{   
  OUTPUT(("%s line %i\n", __FILE__, __LINE__));

  return 0;
}

이런 식으로 네가 가진 모든 힘은printf()당신이 이용할 수 있지만 매크로가 작동하려면 이중 괄호를 견뎌야 합니다.

이중 괄호의 요점은 이것입니다. 매크로 호출임을 나타내기 위해 하나의 집합이 필요하지만, C89에서는 매크로에 불특정 수의 인수를 가질 수 없습니다.그러나 자신의 괄호 안에 인수를 넣음으로써 하나의 인수로 해석됩니다.매크로를 확장할 때DEBUG정의되고, 대체 텍스트는 단어입니다.printf그 다음에 실제로 괄호 안의 여러 항목인 singlel 인수가 뒤따릅니다.그런 다음 괄호는 에서 필요한 괄호로 해석됩니다.printf함수 호출을 해서 모든 것이 해결됩니다.

с99 방식:

#ifdef DEBUG
    #define printd(...) printf(__VA_ARGS__)
#else
    #define printd(...)
#endif

이것은 C99를 필요로 하지 않지만 컴파일러가 릴리스 버전에 대해 최적화를 설정했다고 가정합니다.

#ifdef DEBUG
    #define printd printf
#else
    #define printd if (1) {} else printf
#endif

일부 컴파일러(MS VS2010 포함)에서는 이 기능이 작동합니다.

#define CMT / ## /

모든 컴파일러에 대한 허가는 없습니다.

모든 디버그 호출을 함수에 넣을 수 있습니다.printf_debug그 다음에.DEBUG이 기능 안에.컴파일러가 빈 함수를 최적화할 것입니다.

일반적인 방법은 다음을 사용하는 것입니다.

#ifndef DEBUG
    #define printd(fmt, ...)  do { } while(0)
#else
    #define printd(fmt, ...) printf(fmt, __VA_ARGS__)
#endif

그렇게 하면 끝에 세미콜론을 추가하면 원하는 대로 됩니다.연산이 없기 때문에 컴파일러는 "도..."를 컴파일합니다.그 동안에"

테스트되지 않음:편집 : 테스트 완료, 지금까지 직접 사용 :)

#define DEBUG 1
#define printd(fmt,...) if(DEBUG)printf(fmt, __VA_ARGS__)

정의할 뿐만 아니라DEBUG또한 0이 아닌 값을 입력합니다.

: 잘합니다.std::cout

C++17에서 나는 이런것에 cstexpr을 사용하는것을 좋아합니다.

#ifndef NDEBUG
constexpr bool DEBUG = true;
#else
constexpr bool DEBUG = false;
#endif

그럼 할 수 있겠군요.

if constexpr (DEBUG) /* debug code */

주의할 점은 전처리기 매크로와 달리 범위가 제한되어 있다는 것입니다.다른 디버그 조건에서 액세스할 수 있는 변수를 선언할 수도 없고 외부 함수 범위에서 사용할 수도 없습니다.

의 할 수 .if를 들어 . ,

#ifdef debug
    #define printd printf
#else 
    #define printd if (false) printf
#endif

처럼 에서 이러한 할 수 합니다.-O2. 이 방법은 또한 다음과 같은 경우에 유용합니다.std::cout.

처럼 합니다 맥케이 을 printd와 함께// 다양한 하여 .을(를) 할 수 printd다음과 같은 기능을 수행하지 않습니다.

#ifndef DEBUG
    #define printd(...) do_nothing()
#else
    #define printd(...) printf(__VA_ARGS__)
#endif

void do_nothing() { ; }

이 될 수 GDB , .printf충분합니다.

저는 이 컨스트럭트를 많이 사용합니다.

#define DEBUG 1
#if DEBUG
#if PROG1
#define DEBUGSTR(msg...)        { printf("P1: "); printf( msg); }
#else
#define DEBUGSTR(msg...)        { printf("P2: "); printf( msg); }
#endif
#else
#define DEBUGSTR(msg...)    ((void) 0)
#endif

이렇게 하면 콘솔에서 어떤 프로그램이 어떤 오류 메시지를 표시하는지 알 수 있습니다.또한 오류 메시지를 쉽게 검색할 수 있습니다.

개인적으로 표현의 일부를 정의하는 것을 좋아하지 않습니다.

그것은 된 적이 있다.추천하지 않습니다.테스트할 시간은 없지만 메커니즘은 다음과 같습니다.

 #define printd_CAT(x) x ## x
 #ifndef DEBUG
    #define printd printd_CAT(/)
 #else
    #define printd printf
 #endif

이것은 컴파일러가 컴파일러 자체에서 // 코멘트를 처리하는 경우에 작동합니다(ANSI처럼 /* 코멘트에 대해 두 개의 패스가 있다는 보장은 없습니다).

언급URL : https://stackoverflow.com/questions/1785205/can-you-define-a-comment-in-c