gpt4 book ai didi

c++ - 命名空间和 c++/c 混合 header

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:57 24 4
gpt4 key购买 nike

下面的代码解释了我遇到的情况:

#ifdef __cplusplus
namespace ns
{
class pod
{
const short foo;
const char bar;
public:
pod(short f,char b):foo(f),bar(b){}
char foobar();
};
}
#else
typedef struct pod pod;
#endif


#ifdef __cplusplus
extern "C"{
#endif

extern pod* pod_new(short f, char b);//BANG!!!
extern char pod_foobar(pod* p); //BANG!!!

#ifdef __cplusplus
}
#endif

我不能将 C 链接函数放在命名空间 ns 中,否则 C 客户端将找不到它们的定义。当我将它们从命名空间中拉出时,C++ 定义也不会编译,这都是因为 pod 解决方案,我从 C++ FAQ Lite 中学到的,这只是一个预处理器技巧。遗憾的是,这个技巧无法处理 namespace 。

我该怎么办?我应该放弃所有类型安全,并将 pod* 替换为 void*,还是有更好的解决方案来应对这种情况?有什么建议吗?请!

最佳答案

我只想为函数提供两个不同的声明

对于 C++:

extern "C" ns::pod* pod_new(short f, char b);
extern "C" char pod_foobar(ns::pod* p);

对于 C:

typedef struct pod pod;
extern pod* pod_new(short f, char b);
extern char pod_foobar(pod* p);

但如果这不能满足您的要求,对于 C++,您还可以使用 typedef

typedef ns::pod ns_pod;

对于 C

typedef struct ns_pod ns_pod;

然后有相同的公共(public)函数原型(prototype)。

extern ns_pod* pod_new(short f, char b);
extern char pod_foobar(ns_pod* p);

编辑:在 C 中,struct podstruct ns_pod 是不完整的类型,因此在 C 中,您永远无法直接使用字段或询问其大小。指向不完整类型的指针和 void* 之间的区别在于,您只能将这样的 struct 指针分配给另一个 struct 指针相同的不完整类型。

typedef struct ns_pod2 pod2;
ns_pod* q = pod_new(...); // valid
ns_pod2* r = pod_new(...); // a constraint violation! (= compiler error)

第二个需要一个显式转换,如果你想坚持的话。这是许多 C 程序员不赞成强制转换的原因之一。

关于c++ - 命名空间和 c++/c 混合 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12543536/

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