매크로가 정의되어 있고 동시에 특정 값과 동일한지 확인할 수 있는 방법이 있습니까?
나는 정기적으로 객체와 같은 전처리기 매크로를 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_PRINT
a로 확장되는 매크로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)
또한 아무것도 인쇄되지 않습니다.
실제 인쇄를 수행하는 매크로 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
'programing' 카테고리의 다른 글
XPath: 텍스트 노드 선택 (0) | 2023.10.24 |
---|---|
mysql 등가 데이터 유형 (0) | 2023.10.24 |
Insert 트리거를 설정하여 최대값을 다른 열에 저장합니다. (0) | 2023.10.19 |
표준 시간대를 사용하여 오라클 DATE 열을 타임스탬프 (0) | 2023.10.19 |
sql 덤프 파일에서 mariadb를 업그레이드하는 방법은? (0) | 2023.10.19 |