0

以下预处理器宏:

#define _VARIANT_BOOL /##/

实际上不是有效的C;粗略地说,原因是预处理器被定义为处理令牌流,而上面假设它处理字符流。

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

人们在野外遇到了哪些其他情况,无论是遗留代码,只要该代码可能仍在使用中,预处理器宏实际上是无效的,但仍然可以工作,因为它们是在使用字符的编译器下编写的面向预处理器的实现?

(基本原理:如果我编写了一个适当的、符合标准的、面向令牌的正确干净的实现,我试图提前了解我将不得不破解多少特殊情况。)

4

1 回答 1

0

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

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

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

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

于 2011-10-17T06:28:50.097 回答