我之前已经问过有关extern "C"
的问题,但我收到了混合信号,如果有人能指出我在下面的情景中的最佳做法,我希望如此。我为Linux编写了一个驱动程序,并为struct
调用定义了几个_IO
以及一些_IOR
,_IOW
和ioctl(...)
定义。我的所有结构都不包含任何函数,下面是我使用的示例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"
中。我试图了解是否需要这些不需要调用函数的项目,并且名称重整是一个问题。
答案 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)
名称修改对于数据类型并不重要。你从你的图书馆得到的是纯二进制数据,他们不关心你如何命名它们。对您的类型更重要的是正确的对齐和顺序。