有没有办法检查C/C++中预处理器符号值的类型

GDI*_*der 8 c types c-preprocessor

我的部分代码取决于预处理器符号的值:

int a()
{
#if SDK_VERSION >= 3
    return 1;
#else
    return 2;
#endif
}
Run Code Online (Sandbox Code Playgroud)

比较取决于SDK_VERSION的值.它应该是一个整数或比较整数的东西,在本例中为3.如果SDK_VERSION是无法与整数比较的东西,则会出现编译错误.

如果SDK_VERSION不是预期的类型,有没有办法中止编译?例如:

#if type(SDK_VERSION) != int  # Does not compile, I know
#error "SDK_VERSION must be an integer."
#endif
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 13

使用模板生成此类错误:

template<typename T> struct macro_error;

template<> struct macro_error<int> {};

template<typename T> void check(T) 
{ 
   macro_error<T> SDK_VERSION_must_be_int; 
}
int ignored = (check(SDK_VERSION), 0);
Run Code Online (Sandbox Code Playgroud)

如果SDK_VERSION不是int ,此代码将生成编译错误,其中包含以下字符串:

SDK_VERSION_must_be_int
Run Code Online (Sandbox Code Playgroud)

看这些演示:

并且还注意到第一种情况下的错误消息.它打印这个:

prog.cpp:9: error: ‘SDK_VERSION_must_be_int’ has incomplete type
prog.cpp:9: warning: unused variable ‘SDK_VERSION_must_be_int’
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 5

没有。原因是预处理器符号根本没有类型。

预处理器符号最好被认为只是一个字符串。C 的类型系统直到编译步骤才真正存在,编译步骤发生在预处理器完成工作之后。