字符流宏无效

时间:2011-10-15 11:34:10

标签: macros c-preprocessor string-concatenation stringification

以下预处理器宏:

#define _VARIANT_BOOL /##/

实际上无效 C ;粗略地说,原因是预处理器被定义为在令牌流上工作,而上述假定它适用于字符流。

另一方面,不幸的是,上面实际上发生在Microsoft头文件中,所以无论如何我必须处理它。 (我正在进行预处理器实现。)

人们在野外会遇到的其他案例,无论是遗留代码,只要代码可能仍然在使用旧代码,但实际上并非有效的预处理器宏,但无论如何都要工作,因为它们是在编译器下编写的使用面向字符的预处理器实现?

(理由:如果我编写一个适当的,符合标准的符合标记的实现,我想提前知道有多少特殊情况我将要破解。)

1 个答案:

答案 0 :(得分:0)

标准 (§6.10.3.3 The ## operator) 的相关部分说:

  

如果结果不是有效的预处理标记,则行为未定义。

这意味着您的预处理器可以执行任何喜欢的操作,并且仍然符合标准,包括模拟常见行为。

我认为您仍然可以使用“基于令牌”的实现并支持此行为,通过指定当##运算符的结果不是有效的预处理标记时,结果是两个操作数标记保持不变。您可能还希望让预处理器发出有关无效代码的警告。