【问题标题】:Does the Standard specify how a source file needs to be compiled and would an extra preprocessing step be non-Standard?标准是否指定了需要如何编译源文件以及额外的预处理步骤是否是非标准的?
【发布时间】:2011-07-11 06:36:53
【问题描述】:

这个问题可能有点模糊,但以 Qt 的 moc 步骤为例。它是非标准的还是标准允许的,因为编译器看到的所有内容仍然是纯粹且有效的 C++。另一个例子当然是 config.h 文件,它需要像 moc 文件一样由构建系统生成。

我认为标准中没有规定 moc,但也没有被禁止。

PS:本题来源于this little discussion on SO in the comments

【问题讨论】:

标签: c++ qt compilation c-preprocessor standards


【解决方案1】:

我在这里没有标准的副本(虽然很久以前阅读过草案的某些部分),但我很确定标准甚至没有规定源必须作为文件存在。如果我没记错的话,很久以前(90 年代)IBM 的 Visual Age C++ IDE 试图完全放弃将源存储在文件中。

由于 C++ 标准没有说明构建系统(make、jam 或其他),因此编译器(和 C++ 预处理器)之前的所有内容都超出了标准的范围。因此,像 moc 或生成 config.h 之类的东西对于 C++ 标准来说是非标准的,也不被禁止。

但也有其他标准。例如,对于 Qt,使用 moc 是在调用 C++ 编译器之前预处理文件的“标准”,就像在 linux 开发中使用 autoconf、GNU make 和其他工具一样。

【讨论】:

  • 对我来说听起来很合理。如果我编写一个 Java-to-C++ 编译器,它接收 Java 源代码并输出 C++ 源代码,那么只要我输出的是有效的 C++,C++ 标准就不会在意。但是很明显我写的是一个Java编译器,它不是一个C++编译器。同样moc 是“Qt-C++ 编译器”(或其中的一部分),而不是 C++ 编译器。不同之处在于 moc 的输入比我的 Java 编译器的输入更接近标准 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多