programing

매크로가 정의되어 있고 동시에 특정 값과 동일한지 확인할 수 있는 방법이 있습니까?

lastcode 2023. 10. 19. 22:21
반응형

매크로가 정의되어 있고 동시에 특정 값과 동일한지 확인할 수 있는 방법이 있습니까?

나는 정기적으로 객체와 같은 전처리기 매크로를 C 코드의 부울 플래그로 사용하여 코드의 섹션을 켜고 끕니다.

예를들면

#define DEBUG_PRINT 1

그런 다음에 사용하는 것처럼.

#if(DEBUG_PRINT == 1)
    printf("%s", "Testing");
#endif

그러나, 만약 그 파일이 포함된 헤더 파일이라면 문제가 발생합니다.#define소스 코드에 포함되는 것을 잊어버립니다.매크로가 선언되지 않았기 때문에 전처리기는 매크로를 0과 동일한 것으로 취급하고,#if문이 실행되지 않습니다.

헤더 파일이 포함된 것을 잊어버린 경우 예기치 않은 제멋대로의 동작이 발생할 수 있습니다.

이상적으로, 매크로가 정의되어 있는지 확인하는 것과 특정 값이 동일한지 확인하는 것을 한 줄에서 모두 수행할 수 있어야 합니다.정의되지 않으면 전처리기에서 오류(또는 경고)가 발생합니다.

저는 다음과 같은 것을 찾고 있습니다.

#if-def-and-true-else-throw-error(DEBUG_PRINT)
    ...
#endif

그것은 마치 그것의 조합과 같습니다.#ifdef그리고.#if, 만약 존재하지 않는다면, 사용합니다.#error.

나는 몇가지 방법을 탐색해 보았지만, 프리프로세서 명령어는 내부에서 사용될 수 없습니다.#define블록, 그리고 내가 알 수 있는 한, 매크로가 정의되지 않은 경우 오류/경고를 던지는 전처리기 옵션은 없습니다.#if진술.

이것은 일반적인 경우에는 작동하지 않을 수 있지만(요구하는 것에 대한 일반적인 해결책은 없다고 생각합니다), 특정한 예에서는 이 코드 시퀀스를 변경하는 것을 고려해 볼 수 있습니다.

#if(DEBUG_PRINT == 1)
    printf("%s", "Testing");
#endif

대상:

if (DEBUG_PRINT == 1) {
    printf("%s", "Testing");
}

이것은 더 이상 장황하지 않고 만약에DEBUG_PRINT정의되어 있지 않거나 비교할 수 없는 것으로 정의되어 있는 경우1.

내가 말할 수 있는 한, 매크로가 내부에서 사용될 때 정의되지 않으면 오류/경고를 던지는 전처리기 옵션은 없습니다.#if진술.

C 표준에는 행위가 합법적이라고 명시되어 있기 때문에 오류가 될 수 없습니다.ISO C99 표준의 섹션 6.10.1/3에 의거:

매크로 확장으로 인한 모든 교체 후 및defined단항 연산자가 수행되었으며, 나머지 모든 식별자가 pp-number로 대체되었습니다.0....

짐 발터가 아래 댓글에 언급한 것처럼, 일부 컴파일러(gcc 등)는 경고를 발행할 수 있습니다.그러나 대체하는 행위 이후로0인식되지 않는 전처리기 토큰은 합법적이며 많은 경우 바람직합니다. 실제로 그러한 경고를 활성화할 경우 상당한 양의 노이즈가 발생할 것으로 예상됩니다.

당신이 원하는 것을 정확히 할 방법은 없습니다.매크로가 정의되지 않은 경우 컴파일 실패를 생성하려면 명시적으로 이 작업을 수행해야 합니다.

#if !defined DEBUG_PRINT
#error DEBUG_PRINT is not defined.
#endif

중요한 각 소스 파일에 적용할 수 있습니다.또는 매크로를 함수와 같은 매크로로 변환하여 사용하지 않을 수도 있습니다.#if. 예를 들어, a를 정의할 수 있습니다.DEBUG_PRINTa로 확장되는 매크로printf디버그 빌드를 호출하지만 debug가 아닌 빌드의 경우에는 아무것도 확장되지 않습니다.매크로를 정의하는 헤더를 포함하지 않는 파일은 컴파일에 실패합니다.


편집:

만족도와 관련하여, 저는 코드가 다음을 사용하는 것을 수없이 보아왔습니다.

#if ENABLE_SOME_CODE
...
#endif

대신:

#ifdef ENABLE_SOME_CODE
...
#endif

하도록#define ENABLE_SOME_CODE 0코드를 활성화하는 대신 비활성화합니다.

소스 파일에 DEBUG_PRINT를 직접 사용하는 대신 헤더 파일에 입력합니다.

#if !defined(DEBUG_PRINT)
    #error DEBUG_PRINT is not defined
#endif

#if DEBUG_PRINT
    #define PrintDebug([args]) [definition]
#else
    #define PrintDebug
#endif

PrintDebug를 사용하지만 헤더 파일을 포함하지 않는 소스 파일은 컴파일에 실패합니다.

DEBUG_PRINT를 기반으로 PrintDebug에 대한 호출 이외의 다른 코드가 필요한 경우 Michael Burr의 plain 사용 제안을 사용하는 것을 고려해 보십시오.if보다는#if(예, 최적화 도구는 거짓 상수 검정 내에서 코드를 생성하지 않습니다.)

편집: 그리고 매크로 인수처럼 보이는 쉼표가 없는 한 임의 코드를 포함하거나 제외하도록 위에서 PrintDebug를 일반화할 수 있습니다.

#if !defined(IF_DEBUG)
    #error IF_DEBUG is not defined
#endif

#if IF_DEBUG
    #define IfDebug(code) code
#else
    #define IfDebug(code)
#endif

그러면 다음과 같은 글을 쓸 수 있습니다.

IfDebug(int count1;)  // IfDebug(int count1, count2;) won't work
IfDebug(int count2;)
...
IfDebug(count1++; count2++;)

예, 두 가지를 모두 확인할 수 있습니다.

#if defined DEBUG  &&  DEBUG == 1
#  define D(...) printf(__VA_ARGS__)
#else
#  define D(...)
#endif

이 예에서는 다음과 같은 경우에도#define DEBUG 0그러나 1과 동일하지 않으므로 아무것도 인쇄되지 않습니다.

이 작업도 가능합니다.

#if defined DEBUG  &&  DEBUG
#  define D(...) printf(__VA_ARGS__)
#else
#  define D(...)
#endif

당신이 있다면 여기에#define DEBUG 0그리고 나서.D(1,2,3)또한 아무것도 인쇄되지 않습니다.

DOC

실제 인쇄를 수행하는 매크로 DEBUG_PRINT를 만들기만 하면 됩니다.

#define DEBUG_PRINT(n, str)    \
                               \
  if(n == 1)                   \
  {                            \
    printf("%s", str);         \
  }                            \
  else if(n == 2)              \
  {                            \
    do_something_else();       \
  }                            \
                               \
#endif


#include <stdio.h>

int main()
{
  DEBUG_PRINT(1, "testing");
}

매크로가 정의되어 있지 않으면, 기호가 인식되지 않기 때문에 컴파일러 오류가 발생합니다.

#if 0 // 0/1
#define DEBUG_PRINT printf("%s", "Testing")
#else
#define DEBUG_PRINT printf("%s")
#endif

따라서 "if 0"일 때는 아무것도 하지 않고 "if 1"일 때는 정의된 매크로를 실행합니다.

언급URL : https://stackoverflow.com/questions/17160755/is-there-a-way-to-both-check-a-macro-is-defined-and-it-equals-a-certain-value-at

반응형