【发布时间】:2020-09-16 11:19:30
【问题描述】:
这是一个有效的 C++ 行吗?应该是什么意思?
#
这个呢:
# // a comment
最近的编译器似乎忽略了它,没有错误也没有警告。
它“什么都不做”吗?我有一个头文件,其中在存在此类行的情况下使用 g++ 7.4.0 编译时会出现“兼容性”部分。在非活动的#if 分支中看到这一行被排除在外的编译器似乎不会出错。
注意:Travis CI 上的 Debian Bionic(撰写本文时)上的 gcc 7.4.0 会被此类行绊倒。
【问题讨论】:
-
编译器为什么会“跳闸”。一些文本编辑器在文件结束标记之前编写没有行结束标记的文本文件。这可能会导致一些较旧的 C 或 C++ 预处理器无法读取文件的最后一行。我记得一个预处理器坚决无法识别编辑文件时明显存在的
#endif(关闭包含防护)。修复是在#endif之后的一个额外的空白行(或带有“不要删除此行”的注释的行)。有关信息,请参阅stackoverflow.com/questions/2287967/… -
@Peter 好提示!就我而言,
#早于最后一行。 -
虽然我描述的行为看起来不同,但它是源/头文件的内容可能看起来正确的一个示例,但会导致预处理器出错。在它被隔离之前,当项目源在 unix 和 windows 机器之间复制(并通过
unix2dos()或dos2unix(),取决于复制的方向)然后构建时,我描述的示例引起了头痛。我不禁想知道您是否遇到过类似的问题 - 找到比文本编辑器检查文件的“更低级别”的方法可能会提供一些线索。 -
哦,不只是旧的 gcc 错误,仅此而已。
标签: c++ language-lawyer c-preprocessor