C++ 将C头文件与C++;编译程序
我有一些头文件是为C99程序编写的。此标头包含所有函数定义,并且未与源文件配对。我把它包含在一个C++文件中。 <>我的C++编译器标志包括“代码> -PoANDICT- STD= C++ 11 ,这给我在头文件中提供了各种警告,如“ISO C++禁止复合文字”,“ISO C++禁止可变长度数组”。显然,C++编译器把C99代码当作C++来处理。两个问题:C++ 将C头文件与C++;编译程序,c++,c,gcc,include,C++,C,Gcc,Include,我有一些头文件是为C99程序编写的。此标头包含所有函数定义,并且未与源文件配对。我把它包含在一个C++文件中。 我的C++编译器标志包括“代码> -PoANDICT- STD= C++ 11 ,这给我在头文件中提供了各种警告,如“ISO C++禁止复合文字”,“ISO C++禁止可变长度数组”。显然,C++编译器把C99代码当作C++来处理。两个问题: 当试图编写使用不同编译器在不同平台上正确运行的代码时,这是一个潜在的问题吗 解决警告并生成标准一致性代码的好方法是什么?我在考虑使用GCC做一个
解决问题的正确方法是在C和C++的公共子集中写入报头。使用C99特性(如可变长度数组和复合文字)的函数和对象定义应该被移动到单独的C源文件(用C编译器编译),< P>在C++项目中包含纯C头文件(*),应该将包含语句包在<代码>外“C”< /C>块:
// C++
extern "C" {
// C-code goes here
#include "foo.h"
}
这是因为C++在所有函数名上执行名称限制,以使重载工作。C不使用名称的限制,所以C++解析C函数签名,名称命名为“./P>”。 请注意,
extern“C”
不会将编译器置于“C模式”(没有这种模式,但您可能会错误地认为此指令是这样的),它不会损坏函数名(+更改调用约定并禁止重载;感谢doomster指出这些问题)
但是,如果只包含一个头(使用内联实现),这不应该是个问题,因为这个名称的篡改只会在C源文件或库链接到C++项目时成为问题,因为在这种情况下函数名不同。
上述的,对于<<强>头文件< /强>,请使用C和C++的<>强>子集< /强>,分别用C编译器,而不是C++来提取和编译这些函数的实现。然后,您(希望)可以将这两个部分连接在一起。许多C库已经有与C++兼容的标头,所以这是一个常见的程序。
(*):一些头文件已经被使用语言和语言的公共子集,并在条件<代码>外部“C”< /Cl>块中包装所有的东西,使之与语言C和C++兼容。对于这样的标头,不应该使用这种方法,而只对那些没有这样的块的.
在C++项目中包含纯C头文件(*),您应该将包含语句包在<代码>外“C”< /C>块中:// C++
extern "C" {
// C-code goes here
#include "foo.h"
}
这是因为C++在所有函数名上执行名称限制,以使重载工作。C不使用名称的限制,所以C++解析C函数签名,名称命名为“./P>”。 请注意,
extern“C”
不会将编译器置于“C模式”(没有这种模式,但您可能会错误地认为此指令是这样的),它不会损坏函数名(+更改调用约定并禁止重载;感谢doomster指出这些问题)
但是,如果只包含一个头(使用内联实现),这不应该是个问题,因为这个名称的篡改只会在C源文件或库链接到C++项目时成为问题,因为在这种情况下函数名不同。
上述的,对于<<强>头文件< /强>,请使用C和C++的<>强>子集< /强>,分别用C编译器,而不是C++来提取和编译这些函数的实现。然后,您(希望)可以将这两个部分连接在一起。许多C库已经有与C++兼容的标头,所以这是一个常见的程序。
(*):一些头文件已经被使用语言和语言的公共子集,并在条件<代码>外部“C”< /Cl>块中包装所有的东西,使之与语言C和C++兼容。对于这样的头,您不应该使用此方法,而应该只对其中没有这样一个块的头使用此方法。
尝试gnu++XX(XX=98、03或11);否则,您将不得不提出一个更干净的解决方案。@dans3itz:我使用的是-std=c++11。这就是你的意思吗?1=>是的。2=>创建C99接口到C99代码,并将C++包含在<代码>外部“C”< /C>块中。顺便说一下,C99本身就是一个可移植性问题。Windows中的Visual C++不支持C99。C++不支持大量的C99功能。