C 预处理器警告/错误消息中的字符串插值



我正在对一些需要特定版本的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 打印发生错误或警告的函数名称(在宏扩展之后!(的事实。

最新更新