Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将C头文件与C++;编译程序_C++_C_Gcc_Include - Fatal编程技术网

C++ 将C头文件与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做一个

我有一些头文件是为C99程序编写的。此标头包含所有函数定义,并且未与源文件配对。我把它包含在一个C++文件中。 <>我的C++编译器标志包括“代码> -PoANDICT- STD= C++ 11 ,这给我在头文件中提供了各种警告,如“ISO C++禁止复合文字”,“ISO C++禁止可变长度数组”。显然,C++编译器把C99代码当作C++来处理。两个问题:

  • 当试图编写使用不同编译器在不同平台上正确运行的代码时,这是一个潜在的问题吗
  • 解决警告并生成标准一致性代码的好方法是什么?我在考虑使用GCC做一个预编译的头文件,但是对这个过程不知道足够多,我确信我不会在C++源中包含C预编译头的意外后果。
  • 谢谢

    当试图编写使用不同编译器在不同平台上正确运行的代码时,这是一个潜在的问题吗

    对。GCC可能只是给出警告,其他编译器(例如Visual Studio或带有其他选项的GCC)很可能会给出错误

    解决警告并生成标准一致性代码的好方法是什么

    解决问题的正确方法是在C和C++的公共子集中写入报头。使用C99特性的函数和对象定义(如可变长度数组和复合文字)应移动到单独的C源文件(使用C编译器编译!)

    当试图编写使用不同编译器在不同平台上正确运行的代码时,这是一个潜在的问题吗

    对。GCC可能只是给出警告,其他编译器(例如Visual Studio或带有其他选项的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功能。