1

我在 x64_86 GNU linux 架构上使用 g++ 版本 4.1.2。代码库非常庞大,我对项目中使用的 makefile 没有足够的了解。代码按原样编译得很好。

出于某种调试目的,我需要g++ -E单独预处理 () 几个源文件,然后重新编译它。我正在使用-I. 理想情况下,编译应该没问题。

但是我在标准标题中几乎没有差异,例如:

  1. typedef unsigned long size_t;导致operator new() 编译器生成的声明错误(如果我更改为unsigned int 手动,则此错误消失)
  2. 在像这样的库函数unsigned long numeric_limits<>::max()中,编译器会抱怨大数字,例如922...807L;它生成编译器错误为integer constant is too large for long type
  3. 不匹配的声明__errorno_location()给出编译器错误

我很难找出问题所在。为什么当我在未更改的文件上进行编译时编译会很好,为什么当我g++ -I <> -E在单个文件上提供选项时标准标题开始乱写?

(请注意,我们编写的代码没有问题,它只是来自标准库方面。我尝试将stddef.h其定位unsigned int为 typedef,但这只是解决了第一个问题。)

任何解决此错误的想法将不胜感激。

4

2 回答 2

1

不要单独预处理和编译,或者如果您必须使用一致的编译器选项和一致的环境。

听起来您是在 32 位机器上运行预处理器(或使用该-m32选项),然后在 64 位机器上编译。

于 2012-05-17T17:54:30.483 回答
1

编译预处理器的输出时,请确保使用-fpreprocessed编译器选项,以便预处理器不会再次运行。

如果您不传入该选项,则某些生成看起来像宏的标识符的构造可能会再次扩展为不应扩展的内容。我很难想出一个显示不同的案例(我相信我可以,但这需要一些令人费解的东西并且会非常做作)。但是,实现标头可能会使用一些可能对此选项敏感的神秘宏技术。

于 2012-05-17T18:04:47.423 回答