我正在对需要特定版本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"
现在,假设我想在此消息中包含报告的版本号,以便用户受益。
#error
和#warning
都不会宏扩展其论点。内部空白序列每个都用一个空格替换。该行必须包含完整的令牌。最明智的做法是使这些指令的参数为单个字符串常量;这避免了撇号等问题。
这似乎阻止我将#OPENSSL_VERISON_NUMBER
粘贴到邮件的末尾。
这段代码的作者尝试了一种字符串化方法detailed in this question,但似乎不起作用:
#// 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
相同的无宏扩展限制。
是否有一种将版本字符串连接到错误的明智方法?
答案 0 :(得分:1)
由于#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打印错误或警告发生的函数名称(宏扩展之后!)的事实。