在非函数调用相关的声明中使用 "extern C"
Using "extern C" on non function call related declarations
我知道之前有人问过关于 extern "C"
的问题,但我收到的信号不一,希望有人能指出以下场景中的最佳做法。我为 Linux 写了一个 driver 并定义了几个 struct
以及一些 _IO
、_IOR
和 _IOW
定义 ioctl(...)
来电。 None 我的结构包含任何函数,下面是我使用的 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
我的问题是,我需要在这个header中添加一个extern "C"
吗? header 在我的 driver 中定义,它是用 C 编写的,由用 C++ 编写的用户程序使用。我想是因为没有我不需要的成员函数或特定的库函数调用 extern "C"
。
另外,在没有 extern "C"
的情况下将我的 enum
更改为以下是否安全:
#ifdef __cplusplus >= 201103L
enum class Alignment
#else
enum Alignment
#endif
{
Left = 0,
Right = 1,
Middle = 3
};
编辑:
我的 header 已经包裹在 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 中的 header,而不仅仅是 c++,你应该放弃 enum class
并使用旧时尚 enum
类型。如果您决定仅在 C++ 中使用 header,则不需要 extern "C"
,您可以使用 enum class
.
在标准 C++ 中,extern "C"
仅影响:函数类型、函数名称和变量名称。不给enum
定义。
您的编译器可能会做一些超出标准规定的事情,您必须查阅它的文档。
条件 enum class
是个坏主意。您最终可能会发现 enum
在 C 中的大小与在 C++ 中的大小不同,从而导致互操作性问题。这两个标准均未涵盖,但为了互操作性,最好确保两种语言使用完全相同的代码,而不是 extern "C"
.
名称修饰对于数据类型并不重要。你从你的图书馆得到的是纯二进制数据,他们不关心你如何命名它们。对你的类型来说更重要的是有正确的对齐方式和顺序。
我知道之前有人问过关于 extern "C"
的问题,但我收到的信号不一,希望有人能指出以下场景中的最佳做法。我为 Linux 写了一个 driver 并定义了几个 struct
以及一些 _IO
、_IOR
和 _IOW
定义 ioctl(...)
来电。 None 我的结构包含任何函数,下面是我使用的 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
我的问题是,我需要在这个header中添加一个extern "C"
吗? header 在我的 driver 中定义,它是用 C 编写的,由用 C++ 编写的用户程序使用。我想是因为没有我不需要的成员函数或特定的库函数调用 extern "C"
。
另外,在没有 extern "C"
的情况下将我的 enum
更改为以下是否安全:
#ifdef __cplusplus >= 201103L
enum class Alignment
#else
enum Alignment
#endif
{
Left = 0,
Right = 1,
Middle = 3
};
编辑:
我的 header 已经包裹在 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 中的 header,而不仅仅是 c++,你应该放弃 enum class
并使用旧时尚 enum
类型。如果您决定仅在 C++ 中使用 header,则不需要 extern "C"
,您可以使用 enum class
.
在标准 C++ 中,extern "C"
仅影响:函数类型、函数名称和变量名称。不给enum
定义。
您的编译器可能会做一些超出标准规定的事情,您必须查阅它的文档。
条件 enum class
是个坏主意。您最终可能会发现 enum
在 C 中的大小与在 C++ 中的大小不同,从而导致互操作性问题。这两个标准均未涵盖,但为了互操作性,最好确保两种语言使用完全相同的代码,而不是 extern "C"
.
名称修饰对于数据类型并不重要。你从你的图书馆得到的是纯二进制数据,他们不关心你如何命名它们。对你的类型来说更重要的是有正确的对齐方式和顺序。