1

我的 Mac OS X 系统似乎有几个不同版本的头文件complex.h,而且它们不兼容。

  • /usr/include/complex.h定义数字的 C99 实现_Complex
  • /usr/include/c++/4.2.1/backward/complex.h是围绕 C++ 标头的一个薄包装器.h,它定义了std::complex数字的 C++ 实现。

我的问题是我有一个使用 C99 复数编译的 C 库,我需要将我的 C++ 程序链接到它。但是,它的包含文件引用<complex.h>,以及在编译我的程序时,g++ 选择了 C++ 向后兼容标头,然后一切都变得松散了。

我尝试将-I/usr/include标志传递给 g++,但没有帮助。

包含时如何强制 g++ 使用 C 标头而不是 C++ 标头<complex.h>

4

4 回答 4

1

It's not an entirely optimal solution, but if you simply want to ensure that you get the desired version of the header without modifying the code, you could try using a combination of the -nostdinc and -nostdinc++ with a -I/usr/include flag. If I understand the documentation correctly, that should prevent gcc from looking at the standard list of system header files and instead defer to those supplied with the -I flag. That should override Os X's decision to automatically include the backward compatibility directory on the header search list.

There is the possibility however, that with those options you will be unable to compile. GCC has provisions for the case where you supply a directory with the -I flag that are already present on the default system header search list (it will ignore the extraneous -I flag). Hopefully it is smart enough to notice that the system search list has been cleared (by the -nostdinc flags), allowing it to property add -I/usr/include.

于 2011-11-25T21:54:26.610 回答
1

I figured I should come back and accept an answer.

The top comment basically says "Just don't do it". I ended up not doing it.

于 2014-01-04T12:49:58.907 回答
0

假设 C++ 代码使用的 C 库中的所有函数都没有_Complex参数或返回类型,您可以通过将指令括起来来修改 C 头文件#include <complex.h>,以及使用 / 指令的头文件中的任何其他_Complex内容#ifndef __cplusplus#endif这样C++ 代码不会看到它并被它弄糊涂。另一方面,如果您绝对不能修改 C 标头,您可以将函数原型和 C++ 代码使用的任何其他内容复制到 C++ 代码包含的新标头中。

编辑

如果您真的一心只想消除标头的歧义,则可以尝试#include "/usr/include/complex.h"而不是 simple #include <complex.h>,但是像这样使用标准库标头的绝对路径并不是一个好习惯,并且可能不可移植。

于 2011-11-25T21:37:40.107 回答
0

用外部块包装代码中的标题,即

  extern "C"{
  // include your c header here
  }

我认为这会奏效。很抱歉上面的代码格式,该功能显然不适用于 iPhone。

于 2011-11-25T21:41:35.300 回答