gpt4 book ai didi

c++ - extern "C"仅在函数声明中需要吗?

转载 作者:IT老高 更新时间:2023-10-28 12:37:32 24 4
gpt4 key购买 nike

我编写了一个需要从 C 程序调用的 C++ 函数。为了使它可以从 C 中调用,我在函数 declaration 上指定了 extern "C"。然后我编译了 C++ 代码,但编译器 (Dignus Systems/C++) 生成了 mangled name为功能。因此,它显然不尊重 extern "C"

为了解决这个问题,我将 extern "C" 添加到函数 definition 中。在此之后,编译器生成了一个可从 C 调用的函数名。

从技术上讲,extern "C" 只需要在函数声明中指定。这是正确的吗? (C++ FAQ 有一个很好的例子。)你是否也应该在函数定义中指定它?

这里有一个例子来证明这一点:

/* ---------- */
/* "foo.h" */
/* ---------- */

#ifdef __cplusplus
extern "C" {
#endif

/* Function declaration */
void foo(int);

#ifdef __cplusplus
}
#endif

/* ---------- */
/* "foo.cpp" */
/* ---------- */

#include "foo.h"

/* Function definition */
extern "C" // <---- Is this needed?
void foo(int i) {
// do something...
}

我的问题可能是错误编码的结果,或者我可能发现了编译器错误。无论如何,我想咨询一下 stackoverflow,以确保我知道哪种方式在技术上是“正确”的方式。

最佳答案

'extern "C"' 不应该在函数定义中被要求,只要声明有它并且已经在定义的编译中看到。该标准具体规定(7.5/5 联动规范):

A function can be declared without a linkage specification after an explicit linkage specification has been seen; the linkage explicitly specified in the earlier declaration is not affected by such a function declaration.

不过,我通常也会将'extern "C"' 放在定义上,因为它实际上是一个带有extern "C"链接的函数。很多人讨厌在声明中出现不必要的冗余内容(例如将 virtual 放在方法覆盖上),但我不是其中之一。

关于c++ - extern "C"仅在函数声明中需要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1380829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com