解决方法
为了最大的可靠性:
>使用C编译器编译C源代码.
>使用C编译器编译C源代码
>最好在C中写main()函数.
>将程序与C编译器链接.
确保C头或者自己知道C,或者C代码包含一个extern“C”{…}块中的C头.
(C头文件cheader.h):
#ifndef CHEADER_H_INCLUDED #define CHEADER_H_INCLUDED #ifdef __cplusplus extern "C" { #endif ...main contents of header... #ifdef __cplusplus } #endif #endif /* CHEADER_H_INCLUDED */
或(C源代码):
extern "C" { #include "cheader.h" }
现代C风格非常接近C和C语言的共同子集.然而,任意C代码不是很多原因的C代码,简单地调用C源文件C源文件(通过更改扩展名,或者简单地通过使用C编译器进行编译)不能保证成功.一般来说,将C编译为C并将C编译为C,然后将生成的目标文件与C编译器进行链接(以确保正确的支持库被调用).
但是,如果MSVC编译器说使用MFC的程序必须单独使用C编写(MFC要求C编译(使用.cpp后缀)是报告的错误),则您可能别无选择,只能确保您的C代码可编译为C代码.这意味着你必须从malloc()等人转换返回值;你必须担心别的地方你不使用转换将一个void *转换成其他指针类型;你必须担心C中的sizeof(‘a’)== 4和C中的sizeof(‘a’)== 1;您必须确保在使用之前声明每个函数;您必须确保您的C代码不使用任何C关键字(特别是类型名称,有时也是内联),但完整列表相当大).
在某些方面,您不得不担心C99中不在C 2003或C 2011中的功能的使用,例如灵活的数组成员,指定的初始化程序,复合文字,可变长度的数组等等.但是,如果C代码用于MSVC,那么这可能不是一个问题; MSVC C编译器不支持这些功能(它仅支持C89,而不支持C99).
FWIW:我有一个脚本来追踪C关键字.它包含以下注释:
# http://en.cppreference.com/w/cpp/keywords # plus JL annotations # and C (<iso646.h>) # and_eq C (<iso646.h>) # alignas (C++11 feature) # alignof (C++11 feature) # asm C (core) # auto(1) C (core) # bitand C (<iso646.h>) # bitor C (<iso646.h>) # bool C99 (<stdbool.h>) # break C (core) # case C (core) # catch # char C (core) # char16_t (C++11 feature) # char32_t (C++11 feature) # class # compl C (<iso646.h>) # const C (core) # constexpr (C++11 feature) # const_cast # continue C (core) # decltype (C++11 feature) # default(1) C (core) # delete(1) # double C (core) # dynamic_cast # else C (core) # enum C (core) # explicit # export # extern C (core) # false C99 (<stdbool.h>) # float C (core) # for C (core) # friend # goto C (core) # if C (core) # inline C (core) # int C (core) # long C (core) # mutable # namespace # new # noexcept (C++11 feature) # not C (<iso646.h>) # not_eq C (<iso646.h>) # nullptr (C++11 feature) # operator # or C (<iso646.h>) # or_eq C (<iso646.h>) # private # protected # public # register C (core) # reinterpret_cast # return C (core) # short C (core) # signed C (core) # sizeof C (core) # static C (core) # static_assert (C++11 feature) # static_cast # struct C (core) # switch C (core) # template # this # thread_local (C++11 feature) # throw # true C99 (<stdbool.h>) # try # typedef C (core) # typeid # typename # union C (core) # unsigned C (core) # using(1) # virtual # void C (core) # volatile C (core) # wchar_t C (core) # while C (core) # xor C (<iso646.h>) # xor_eq C (<iso646.h>)
(1)后缀是CPP参考的脚注:
>(1) – 意思在C 11中改变