Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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 - Fatal编程技术网

C++ 我应该放一个C++;每个头文件中的宏保护?

C++ 我应该放一个C++;每个头文件中的宏保护?,c++,c,C++,C,我正在写一个小C项目。因为我希望它也包含在C++中,所以我想到使用C++守护程序来工作,比如: #ifdef __cplusplus extern "C" { #endif // code #ifdef __cplusplus } #endif 在我的项目中,我有一些头文件不能直接包含在最终的C++文件中。但是我面临的疑问是:在头文件中放置C++守护程序也是必要的预防吗? 不能直接包含在最终C++文件中 即使通过嵌套的包间接地包含,C++编译也会被应用,而没有外“C” >

我正在写一个小C项目。因为我希望它也包含在C++中,所以我想到使用C++守护程序来工作,比如:

#ifdef __cplusplus
extern "C" {
#endif
// code
#ifdef __cplusplus
}
#endif

在我的项目中,我有一些头文件不能直接包含在最终的C++文件中。但是我面临的疑问是:在头文件中放置C++守护程序也是必要的预防吗?

不能直接包含在最终C++文件

即使通过嵌套的包间接地包含,C++编译也会被应用,而没有<代码>外“C”<代码> > C++编译模块中的符号将与你连接到的C编译模块中的符号不一样。

除了这是一个好的实践,并且不会对它们的互操作造成任何危害——现在您可能不打算在C++编译中使用这些头,但是您不能知道它们将来可能如何使用。

如果要明确阻止C++编译应用到C报头,最好的解决方法是使用:

#if defined __cplusplus
    #error C-only header included in C++ compilation
#endif

这样,在编译时(或实际预处理)突出了这个问题,而不是导致链接错误,当链接告诉您“代码> XXX < /CUT>在您已经明确定义时,它是不明确的,但在不同的语言中,则可能难以解释。”/P>如果您有标题,则不必包含在C++中,那么没有理由在C++中放置C++守护程序,并且如果定义了代码“*> CPLUS PLUS < /COD>”,则该文件中应该有一个预处理器错误;例如,代码“>代码错误”这个文件不应该与C++一起使用。。头报警器只在包含一个以上C++文件中的头文件时使用。另外,在使用WiC++中,你可以简单地使用“C++”和“{”代码,而不是使用命名C++守护程序。IMHO C++头应该有不同的名称(比如说HPP),这样我们就不会被C语言搞乱。此外,如果在某些头上不期望C++的字符,那么我希望C++用户通过添加外部的“C”来处理它。你可以用一个HPP来包装C标题,添加这些警卫,这主要是在C++头部中做的,它封装了C STD头。@亚历克斯,<代码> >我以为这只是一个替代品,你所描述的不是“宏保护”。它是条件编译。如果函数被编译为C,则它们的声明需要指定为<代码>外“C”<代码>,以从编译为C++的代码调用它们。如果所有C代码都被编译成C++,那么C函数通常不需要是代码>外部“C”<代码>,值得注意的是,另一种方法是在头中不使用<代码>外部“C”< /Cux>块,而是让消费C++项目包< <代码> >包含<代码>外部代码“C”<代码>块