我正在为一些C++代码编写C接口,我想知道哪些C++特性可以在外部C块中使用.

目前我使用的是

#ifdef __cplusplus
extern "C" {
#endif //__cplusplus

// Interface functions

#ifdef __cplusplus
}
#endif //__cplusplus

当使C接口可以在C和C++中使用时.

我想知道的具体C++特性有

  • 命名空间#ifdef __cplusplusnamespace ... {、...
  • 枚举课程#ifdef __cplusplus#define ENUM enum class、...
  • 在 struct 中添加成员类型,即using(同样是有条件的)
  • noexcept(同样是有条件的)
  • 内联类方法(同样是有条件的)

EDIT

一个澄清的例子


#ifdef __cplusplus
#define CPP_ONLY( stuff ) stuff
#else
#define CPP_ONLY( stuff ) 
#endif //__cplusplus


#ifdef __cplusplus
extern "C" {
#endif //__cplusplus

CPP_ONLY( namespace Example { ) //(1) 

enum CPP_ONLY( class ) Directions { //(2)
    Left, Right
}

struct IntArray
{
    size_t mSize;
    int * mArray;

    CPP_ONLY( using value_type = int; ) //(3)
    CPP_ONLY( inline size_t size() { return mSize; } ) //(5)
}

int HelloWorld() CPP_ONLY( noexcept ); //(4)

CPP_ONLY( } ) // close namespace

#ifdef __cplusplus
}
#endif //__cplusplus

CPP_ONLY个代码中是否有任何代码会在以下位置导致编译/链接问题:

  • 代码的c++实现
  • 标题的c++内部用法
  • 在c++中使用标头.

推荐答案

这个问题很容易被误解.你几乎可以使用extern "C"块内的任何功能,尽管结果可能会很奇怪.

例如:

extern "C" {
  // these are the same function
  namespace A { void f(); }
  namespace B { void f(); }
}

但与标题相反,你的问题正文实际上并不是关于extern "C"个块内的东西,而是关于你可以在C++版本的代码中拥有什么,这些代码不会出现在C版本中.这就是它变得非常棘手的地方--C和C++标准都不觉得有责任对这个问题进行裁决,所以真正的答案是"任何在您的编译器上工作的东西".

旁白:我应该指出,CPP_ONLY(namespace X {)在语法上是不正确的.您只能使用真正的预处理器块进行不平衡大括号,而不能将其作为宏参数.

除此之外,您可能应该表现得好像C++的S定义规则必须跨语言遵循,即C和C++版本在该规则下应该具有相同的定义.

特别是,这禁止:

  • 混合enumenum class
  • struct内加上anything whatsoever-为了正确地跟随ODR,定义必须逐个令牌相同.(尽管我应该指出,我非常确定MS MIDL编译器在其生成的代码中违反了这一点.)

报关单上的noexcept美元,我说不清.

C++相关问答推荐

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

#If指令中未定义宏?

二进制计算器与gmp

C在声明带有值的数组时,声明大小有用吗?

实现简单字典时C语言中的段错误

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

每次除以或乘以整数都会得到0.0000

如何使用C++在控制台中以彩色打印被阻止的客户端

接受任何参数的函数指针是否与接受不同参数的函数兼容

添加函数会 destruct 嵌入式C代码(无IDE)

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

链表删除 node 错误

存储和访问指向 struct 的指针数组

execve 不给出which命令的输出

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

通过修改c中的合并排序对数组的偶数索引进行排序

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

我们可以在不违反标准的情况下向标准函数声明添加属性吗?

如何根据当前舍入方向将float转换为int?