使用 C 预处理器 #define 重新定义关键字
围绕 C 标准中使用 #define 重新定义语言关键字的有效性的激烈争论经常引发争议。本文旨在阐明这个有争议的问题。
根据 C 标准 (§17.4.3.1.1/2),预处理器宏不能重新定义在标准库头中声明或定义的名称。此外,它禁止在包含标准标头的翻译单元中重新定义词法上与 C 关键字相同的宏。
但是,在 C 中,规则发生了明显的变化。 C 0x 草案 (FCD §17.6.3.3.1) 明确禁止使用 #define 或 #undef 重新定义关键字。这一举措似乎符合普遍共识,即使用预处理器操作关键字可能会导致不可预测的行为和潜在的标准违规。
尽管如此,值得注意的是“翻译单元不得 #define 或 #undef”这一声明名称在词法上与关键字相同”此后在最终的 C 11 标准中进行了修订。新措辞(ISO/IEC 14882:2011 §17.6.4.1/4)如下:“翻译单元不得为与关键字词法相同的名称定义宏。”
此修订似乎表明彻底禁止使用 #define 重新定义关键字已从标准中删除。但是,重新定义标准标头中声明或定义的名称的禁令仍然有效(ISO/IEC 14882:2011 §17.6.4.1/6)。
鉴于这一持续的争论,建议在以下情况下谨慎行事:尝试重新定义 C 程序中的语言关键字。虽然在某些条件下在技术上可能是可行的,但这种做法可能会损害程序与各种编译器和工具链的兼容性。遵守标准并使用替代机制(例如预处理器宏或用户定义类型)通常被认为是更安全的方法。
以上是可以使用 #define 预处理器重新定义 C 关键字吗?的详细内容。更多信息请关注PHP中文网其他相关文章!