Macros 无效的字符流宏

Macros 无效的字符流宏,macros,c-preprocessor,string-concatenation,stringification,Macros,C Preprocessor,String Concatenation,Stringification,以下预处理器宏: #define _VARIANT_BOOL /##/ 实际上不是有效的C;粗略地说,原因是预处理器被定义为处理令牌流,而上面假设它处理字符流 另一方面,不幸的是,上述内容实际上发生在Microsoft头文件中,因此我必须处理它。我正在做一个预处理器的实现 人们在野外还遇到过哪些其他情况,无论是在旧代码中,只要代码仍在使用,还是在旧代码中,预处理器宏实际上是无效的,但由于它们是在使用面向字符的预处理器实现的编译器下编写的,所以仍然可以工作 理由:如果我编写一个合适的、符合清洁标

以下预处理器宏:

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

另一方面,不幸的是,上述内容实际上发生在Microsoft头文件中,因此我必须处理它。我正在做一个预处理器的实现

人们在野外还遇到过哪些其他情况,无论是在旧代码中,只要代码仍在使用,还是在旧代码中,预处理器宏实际上是无效的,但由于它们是在使用面向字符的预处理器实现的编译器下编写的,所以仍然可以工作


理由:如果我编写一个合适的、符合清洁标准的面向令牌的实现,我试图提前了解我需要破解多少特殊情况。

标准§6.10.3.3的相关部分操作员说:

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

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


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

为什么要处理它?仅仅因为微软有一个非标准的预处理器和利用它的非标准头,这并不意味着你需要处理它。好的,目的是创建可以用现有代码做有用事情的工具。无法读取Microsoft头文件的工具,即使它们在参考标准时具有道德制高点,也不会那么有用。在这种情况下,我认为您的问题没有明确的答案。您需要支持的内容完全取决于您的目标市场。如果您正在编写符合标准的预处理器,这是一件事,否则,您必须支持的扩展取决于您打算在什么环境中使用您的产品,这完全取决于您或完全开放。我的目标是尽可能接近“任何环境中仍在使用的任何C代码”。任何环境中仍在使用的任何C代码。你一定是在开玩笑吧?这是一个简单的大量代码,你将永远无法获得99.99%的剩余部分,只有很少的项目会考虑使用一个新的工具与一个新的预处理器。