elo*_*age 38 c gcc c-preprocessor
我想在#warning指令中打印一个宏值(展开宏).
例如,对于代码:
#define AAA 17
#warning AAA = ???
Run Code Online (Sandbox Code Playgroud)
所需的编译时输出将是
warning: AAA = 17
Run Code Online (Sandbox Code Playgroud)
我用什么???,或者,我如何扩充代码?
moo*_*eep 46
您可以使用预处理程序指令#pragma message.
例:
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#define AAA 123
#pragma message "content of AAA: " STR(AAA)
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
输出可能如下所示:
$ gcc test.c
test.c:5:9: note: #pragma message: content of AAA: 123
#pragma message("content of AAA: " STR(AAA))
^
Run Code Online (Sandbox Code Playgroud)
以供参考:
如果你真的想发出警告,下面的内容也会有效.但是,它取决于启用C99(适用于gcc 4.8.2或更高版本,未在早期版本上测试):
#define N 77
#define __STRINGIFY(TEXT) #TEXT
#define __WARNING(TEXT) __STRINGIFY(GCC warning TEXT)
#define WARNING(VALUE) __WARNING(__STRINGIFY(N = VALUE))
#if N == 77
_Pragma (WARNING(N))
#endif
Run Code Online (Sandbox Code Playgroud)
我不建议使用#warning,因为它不是标准的C.此外,你想要警告的是什么,但不会抛出错误?警告通常是编译器在您做一些可疑的事情时使用的东西,我们完全是危险的,但C标准允许这样做.在正常的应用程序中你没有这样的情况,你会希望它完美地编译或根本不编译.因此我使用标准的#error而不是非标准的#warning.
您无法键入预处理器定义的实际内容.这样的事可能就足够了:
#if (AAA < SOMETHING) && (AAA > SOMETHING_ELSE)
#error AAA is bad.
#endif
Run Code Online (Sandbox Code Playgroud)
我认为这对程序员来说足够详细.但是,如果您真的需要更多详细信息并且拥有现代C编译器,则可以使用static_assert.然后你可以达到你想要的东西:
#include <assert.h>
#define xstr(s) str(s)
#define str(s) #s
#define err_msg(x) #x " is " xstr(x)
#define AAA 17
static_assert(AAA != 17, err_msg(AAA));
Run Code Online (Sandbox Code Playgroud)
这个宏的混乱应该打印AAA是17. 这里可以找到关于这些宏如何工作的解释.
我不确定static_assert是否包含在C99或C11中,它肯定在C11中.您可能必须使用某些GCC扩展来启用它.