extern" C"用法(标签的放置)

时间:2017-05-31 20:54:22

标签: c++ g++ extern

以下是否存在差异:

// c_header.h
void foo(void);
// main.cpp
extern "C" {
#include "c_header.h"
}
void main(void)
{
    foo();
}

// c_header.h
extern "C" {
void foo(void);
}
// main.cpp
#include "c_header.h"
void main(void)
{
    foo();
}

是foo的函数调用而不是c ++受损吗?

2 个答案:

答案 0 :(得分:2)

是的,有区别。第一个例子是一个可怕的代码的例子,而第二个是一个正确的方法。

要理解我为什么这么说,请考虑有多少翻译单元可能包含此标题。因为如果你知道一个事实只会有一个,你甚至不需要担心损坏。

但是,如果C编译器也可以看到c_header,那么extern "C"指令需要隐藏在#ifdef ___cplusplus后面。

答案 1 :(得分:1)

没有区别。请记住,#include由预处理器处理;编译器在编译预处理的main.cpp时会看到完全相同的代码。

P.S。当然,从代码样式/可维护性角度来看,您不希望在#include中包含extern "C"。这主要是针对特殊情况保留的,例如当你需要包含第三方纯C头而不修改它时。