gpt4 book ai didi

c++ - C++代码: how to avoid "mismatched-tag" warning的C接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 22:58:11 24 4
gpt4 key购买 nike

我需要用 C 接口(interface)包装一个 C++ 库。我的代码就像这个小例子:

我的库.cpp:

#include <iostream>

using namespace std;

class MyClass {
public:
void do_something() {
cout << "this is something\n";
}
};

// implementing C interface:

extern "C" {
#include "mylib.h"
};

MyClass *lib_init() {
return new MyClass;
}

void lib_release(MyClass *ptr) {
delete ptr;
}

void do_something(MyClass *handler) {
handler->do_something();
}

mylib.h:

struct MyClass;
typedef struct MyClass *MyClassHandler;

MyClassHandler lib_init();
void lib_release(MyClassHandler h);
void do_something(MyClassHandler h);

测试.c:

#include "mylib.h"

int main() {
MyClassHandler h;
h = lib_init();
do_something(h);
lib_release(h);
}

生成文件:

mylib.o: mylib.cpp mylib.h
g++ -Wall -c $< -o $@

test.o: test.c mylib.h
gcc -c $<

test: test.o mylib.o
g++ -o $@ $^

测试代码有效,但使用 clang 和 -Wall 我收到以下烦人的警告:

./mylib.h:3:1: warning: struct 'MyClass' was previously declared as a class [-Wmismatched-tags]

我发现了以下有趣的信息:

Developing C wrapper API for Object-Oriented C++ code (如何在 C 头文件中包装 C++ 库)

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61339#c6 (gcc 开发者认为 clang 发出的警告是愚蠢的)

问题是:处理这个警告的最好方法是什么?

我看到了一些可能性:

  1. 在头文件中使用#pragma 禁用警告

  2. 在 cpp 文件中也使用 struct,注意用适当的 public/private 修饰符显式标记所有数据

  3. 将类包装成结构

  4. 更改用于实现 C 接口(interface)的范例(例如,使用虚拟结构和 reinterpret_cast)

最佳做法是什么?你有什么引用要指出吗?

最佳答案

我认为最佳做法是声明一个新结构来保存库的状态。这可能看起来像:

// .cpp
struct MyLibHandle_ {
MyClass my_class;
};

...

// .h
struct MyLibHandle_;
typedef MyLibHandle_ *MyLibHandle;

但通常它实际上可能有多个类,例如它还将包含一个记录器实例或其他任何东西。剩下的就很简单了,因为你在 C 和 C++ 中都有 struct。不要reinterpret_cast,这看起来总是有点可疑。这就是我一直以来看到的其他人所做的事情。

无法知道它在内部是如何工作的,但 OpenCL 对“不透明类型”的惯用定义看起来像这样(取自 CL/cl.h):

typedef struct _cl_command_queue *  cl_command_queue;

因为 C 的类型是不透明的,你也可以这样做:

#ifdef __cplusplus
class MyClass; // class for the C++ compiler
#else
struct MyClass; // struct for the C compiler
#endif
typedef MyClass *MyClassHandle;

这应该几乎适用于任何地方。

关于c++ - C++代码: how to avoid "mismatched-tag" warning的C接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41378623/

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