在非函数调用相关的声明中使用 "extern C"

Using "extern C" on non function call related declarations

我知道之前有人问过关于 extern "C" 的问题,但我收到的信号不一,希望有人能指出以下场景中的最佳做法。我为 Linux 写了一个 driver 并定义了几个 struct 以及一些 _IO_IOR_IOW 定义 ioctl(...) 来电。 None 我的结构包含任何函数,下面是我使用的 structenumioctl 的示例:

#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".

名称修饰对于数据类型并不重要。你从你的图书馆得到的是纯二进制数据,他们不关心你如何命名它们。对你的类型来说更重要的是有正确的对齐方式和顺序。