问题
Just as the title says. I want to use a preprocessor macro in the text of an #error statement:
#define SOME_MACRO 1
#if SOME_MACRO != 0
#error "SOME_MACRO was not 0; it was [value of SOME_MACRO]"
#endif
In this example I want the preprocessor to resolve [value of SOME_MACRO]
to the actual value of SOME_MACRO
which in this case is 1. This should happen before the preprocessor, compiler or whatever processes #error prints the error output
Is there a way to do that or is this just not possible?
I don't want to know if there is an ISO C++ standard way to do that, because afaik the preprocessor directive #error
is not stated in any ISO C++ standard. However, I know GCC and Visual C++ support #error
. But my question is not specific to those compilers, I'm just curious if any C/C++ compiler/preprocessor can do that.
I tried to search for that topic but without any luck.
回答1:
For completeness the C++0x way I suggested (using the same trick as Kirill):
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#define EXPECT(v,a) static_assert((v)==(a), "Expecting " #v "==" STRING(a) " [" #v ": " STRING(v) "]")
#define VALUE 1
EXPECT(VALUE, 0);
Gives:
g++ -Wall -Wextra -std=c++0x test.cc
test.cc:9: error: static assertion failed: "Expecting VALUE==0 [VALUE: 1]"
回答2:
In Visual Studio you can use pragma
message as follows:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#define SOME_MACRO 1
#if SOME_MACRO != 0
#pragma message ( "SOME_MACRO was not 0; it was " STRING(SOME_MACRO) )
#error SOME_MACRO was not 0;
#endif
This will generate two messages, but you'll get the value of SOME_MACRO
. In G++ use the following instead (from comments: g++ version 4.3.4 works well with parenthesis as in the code above):
#pragma message "SOME_MACRO was not 0; it was " STRING(SOME_MACRO)
回答3:
#define INVALID_MACRO_VALUE2(x) <invalid_macro_value_##x>
#define INVALID_MACRO_VALUE(x) INVALID_MACRO_VALUE2(x)
#if SOME_MACRO != 0
#include INVALID_MACRO_VALUE(SOME_MACRO)
#endif
generates "Cannot open include file: 'invalid_macro_value_1': No such file or directory" in Visual Studio 2005 and probably similar messages on other compilers.
This doesn't answer your question directly about using #error, but the result is similar.
来源:https://stackoverflow.com/questions/6002594/is-there-a-way-to-have-the-c-preprocessor-resolve-macros-in-an-error-statement