对非函数调用相关声明使用 "extern C"
Using "extern C" on non function call related declarations
我知道以前有人问过关于extern "C"
的问题,但我得到的信号很复杂,希望有人能告诉我下面场景中的最佳实践是什么。我已经为Linux编写了一个驱动程序,并为ioctl(...)
调用定义了几个struct
以及一些_IO
, _IOR
和_IOW
定义。我的结构中没有包含任何函数,下面是我使用的struct
, enum
和ioctl
的示例:
#ifdef __cplusplus
extern "C" {
#endif
enum Alignment
{
Left = 0,
Right = 1,
Middle = 3
};
struct Data
{
int Size;
void* Address;
};
#define foo _IOR(DRV_ID, 1, struct Data*);
#ifdef __cplusplus
}
#endif
我的问题是,我需要添加一个extern "C"
到这个标题吗?头文件是在我的驱动程序中定义的,它是用C编写的,由用c++编写的用户程序使用。我认为,因为没有成员函数或特定的库函数调用,我不需要extern "C"
。另外,把enum
改成下面没有extern "C"
是否安全:
#ifdef __cplusplus >= 201103L
enum class Alignment
#else
enum Alignment
#endif
{
Left = 0,
Right = 1,
Middle = 3
};
编辑:
我的头已经在extern "C"
中包装了。我试图理解这是否需要不调用函数和名称混淆的项目。
在标准c++中,extern "C"
只影响:函数类型、函数名和变量名。不符合enum
定义。
你的编译器可能会做一些超出标准规定的事情,你必须查阅它的文档。
条件enum class
是一个坏主意。最终,C中的enum
的大小可能与c++中的不同,从而导致互操作性问题。这两个标准都没有涵盖,但是为了互操作性,最好确保除了extern "C"
之外,这两种语言都使用了完全相同的代码。
这里有冲突:
你的代码是这样的:
#ifdef __cplusplus >= 201103L
enum class Alignment
#else
enum Alignment
但是extern "c"
应该放在确切的宏中:
#ifdef __cplusplus
extern "C"
#endif
enum Alignment
结果,如果您附加了两个宏:
extern "C" enum class Alignment
但是这是非法的,因为C语言不知道这样的声明。
因此,我猜如果你想使用extern "C"
,能够使用c的头,而不仅仅是c++,你应该放弃enum class
,使用旧的enum
类型。如果您决定只使用c++中的头,则不需要extern "C"
,您可以使用enum class
。
名称混淆对于数据类型并不重要。你从库中得到的是纯二进制数据,它们不在乎你怎么命名它们。更重要的是要有正确的对齐和顺序。
- 使用说明符 extern 声明的C++中的标识符链接
- 如何使用默认值将枚举声明为 extern
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 在命名空间 c++ 中正确声明 extern 变量
- 有什么方法可以在标头中定义和声明 extern 对象吗?
- 在 extern 中声明一个使用向量的函数 "C" {}
- C++中未初始化的引用(使用 extern 声明)
- 不可变的全局对象应该声明为"const my_result_t BLAH"还是"extern const my_result_t BLAH;"?
- 如何使 extern 方法在共享库中定义,但使用 cmake 在其他目标中声明?
- GNU 链接器:如果头文件中的指针被声明为 NULL 和/或 extern,则出错
- 如何在不同的命名空间中使用双重声明的 extern "C"函数进行 clang 构建(如 msvc 和 gcc)
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 使用extern的正向声明(在C/C++的上下文中)
- Extern const,它是声明,也是正向声明
- 为什么我应该使用extern关键字来声明命名空间范围中的变量
- 默认情况下全局变量是 extern 还是等效于在全局中使用 extern 声明变量
- 有没有办法使用 g++ 标志将函数声明为 extern "C"?
- 在模板实例化和extern模板声明中使用typedef
- 如何链接.h文件中声明为extern的函数,以创建.dll文件
- 将我的对象声明为 extern 会给出"未在此范围内声明"错误