在非函数调用相关声明上使用“extern C”

时间:2016-07-03 23:05:51

标签: c++ c enums extern ioctl

我之前已经问过有关extern "C"的问题,但我收到了混合信号,如果有人能指出我在下面的情景中的最佳做法,我希望如此。我为Linux编写了一个驱动程序,并为struct调用定义了几个_IO以及一些_IOR_IOWioctl(...)定义。我的所有结构都不包含任何函数,下面是我使用的示例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

我的问题是,我是否需要在此标头中添加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"中。我试图了解是否需要这些不需要调用函数的项目,并且名称重整是一个问题。

3 个答案:

答案 0 :(得分:4)

在标准C ++中,enum仅影响:函数类型,函数名和变量名。不是enum class定义。

您的编译器可能会执行超出标准所述的操作,您必须查阅其文档。

条件enum是一个坏主意。您可能最终得到的extern "C"在C中的大小与在C ++中的大小不同,从而导致互操作性问题。这两个标准都没有涵盖这一点,但为了实现互操作性,最好确保为package com.textview.android.jsonsuccessful; import org.json.JSONObject; interface AsyncResult { void onResult(JSONObject object); }以外的两种语言使用完全相同的代码。

答案 1 :(得分:2)

这里存在冲突:

你的代码是这样的:

#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并使用旧时尚{{ 1}}类型。如果您决定仅使用c ++标题,则不需要enum,您可以使用extern "C"

答案 2 :(得分:2)

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