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

时间:2016-02-11 19:32:00

标签: c c-preprocessor

我正在对需要特定版本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"

现在,假设我想在此消息中包含报告的版本号,以便用户受益。

docs for CPP说:

  

#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相同的无宏扩展限制。

是否有一种将版本字符串连接到错误的明智方法?

1 个答案:

答案 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

Demo

在这里,我利用了gcc打印错误或警告发生的函数名称(宏扩展之后!)的事实。