我正在对一些需要特定版本的OpenSSL的代码进行故障排除。如果 OpenSSL 导出的版本号不够高,则会返回警告,并关闭程序的各个位。
代码如下所示:
#if OPENSSL_VERSION_NUMBER >= 0x10002000
//code here
#else
#warning "http_auth_ldap: Compiling with OpenSSL < 1.0.2, certificate verification will be unavailable"
现在,假设我想在此消息中包含报告的版本号,以方便用户。
CPP的文档说:
#error
和#warning
宏观都没有扩展其论点。每个内部空格序列都替换为一个空格。该行必须由完整的令牌组成。最明智的做法是将这些指令的参数设置为单个字符串常量;这避免了撇号等问题。
这似乎阻止了我只是将#OPENSSL_VERISON_NUMBER
粘贴到消息的末尾。
这段代码的作者尝试了这个问题中详述的字符串化方法,但它似乎不起作用:
#// used for manual warnings
#define XSTR(x) STR(x)
#define STR(x) #x
这会导致警告读数:
warning: http_auth_ldap: Compiling with OpenSSL < 1.0.2, certificate verification will be unavailable. OPENSSL_VERSION_NUMBER == OPENSSL_VERSION_NUMBER [-W#pragma-messages]
..和构建失败。 #pragma message
似乎受到与#warning
相同的无宏观扩张限制。
有没有一种理智的方法可以将版本字符串连接到错误中?
由于#warrning
不可移植,您可以尝试利用您了解的有关实现的其他内容。
#define cat(a,b) cat2(a,b)
#define cat2(a,b) a##b
#define FOO 199
#define REQUIRED_FOO 200
#if FOO < REQUIRED_FOO
void cat(cat(FOO_is_, FOO),
cat(_required_FOO_is_, REQUIRED_FOO))()
{
#warning Busted!
}
#endif
演示。
在这里,我利用了 gcc 打印发生错误或警告的函数名称(在宏扩展之后!(的事实。