gpt4 book ai didi

c - 命名空间和 extern 'C' 编译错误

转载 作者:行者123 更新时间:2023-11-30 20:38:00 25 4
gpt4 key购买 nike

我尝试用谷歌搜索错误,但没有成功。也许我正在寻找错误的方向。我正在尝试编译一个文件,但是当我厌倦编译它时,编译器给了我这些错误:

C2059 语法错误:“;”
C2059 语法错误:'}'
C2061 语法错误:标识符“namespace_name”
C2449 语法错误:在文件范围内找到“{”(缺少 header ?)

在我的 code.c 文件中:

#ifndef myclass_c
#define myclass_c

#include "classA.h"
#include "classB.h"
#include "conversionLib.h" // no namespace is being used here

namespace namespace_name {

// ... generated codes in C....
}
#endif

在classA.h和classB.h中:

#ifndef myclassA_h // myClassB_h if in classB
#define myclassA_h // myClassB_h if in classB

#include "classC.h" // both classA and classB include classC.h

namespace namespace_name {
#ifdef __cplusplus
extern "C" {
#endif

// ... generated codes in C....

#ifdef __cplusplus
}
#endif
}
#endif

在classC.h中(与classD.h相同)

#ifndef myclassC_h // myclassD.h for classD.h
#define myclassC_h // myclassD.h for classD.h

#include "classD.h" // no includes in classD.h

namespace namespace_name {
#ifdef __cplusplus
extern "C" {
#endif

// ... generated codes in C....

#ifdef __cplusplus
}
#endif
}
#endif

我做错了什么?或者我错过了什么?任何建议将不胜感激。如果这个问题/格式令人困惑,我深表歉意。提前致谢

最佳答案

主要问题似乎是,您在 .c 文件中使用 C++ 语法。C 不支持命名空间!

extern "C" 函数放入命名空间中没有多大意义。在 C++ 中,编译器执行称为“名称管理”的操作,它实际上将标识符的 namespace (例如类名称、 namespace )和附加信息(例如函数或模板参数)放入其符号名称中,该符号名称是链接器的输入.

extern "C" 告诉 C++ 编译器不要这样做。因此您失去了与周围 namespace 的绑定(bind)(以及重载函数的可能性)。

如果函数是从 C++ 中包含的,那么将它们放在特殊的命名空间中可能是一个好主意,但另一方面,大多数 C 命名空间都是使用函数名称的特殊前缀来构建的。因此,在 C++ 中,您最终会得到显式 C++ namespace 和隐式函数前缀 namespace 。

如果您仍然希望在 C-Function 周围有一个 C++ 命名空间,则必须将命名空间定义包含到您的 #ifdef __cplusplus block 中。 (但我什至不知道 C++ 标准是否允许这样做)

关于c - 命名空间和 extern 'C' 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30912417/

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