c++ - 带 C 链接的非外部函数

标签 c++ c linkage

是否可以在没有外部链接的情况下使用 C 链接声明函数?尝试编译时

extern "C" static void f() {}

我明白了

f.cc:1: error: invalid use of 'static' in linkage specification

这在某种程度上是有道理的。在 namespace { extern "C"void f() {} } 中,extern 说明符似乎覆盖了匿名命名空间的限制范围。

如果这不可能,将函数指针传递给 C 是否重要?

最佳答案

你可以做到

extern "C" {
  static void f() {}
}

这将为函数 f 提供 C 类型链接,这实际上意味着它在您的平台上使用 C 调用约定。函数名称仍将具有 C++/内部链接,因为语言链接规范仅适用于外部链接的函数名称。

如果您直接在声明中指定 extern "C",标准规定 extern "C" 也被视为存储类说明符,因此如果您要添加 static,则会发生冲突。

Does it matter when passing a function pointer to C

从理论上讲,这可能很重要 - 允许实现在行为上有所不同,从调用类型具有 C++ 链接的函数到调用类型具有 C 链接的函数。不过,我不知道实现细节,只知道规范是怎么说的。最好遵循规范,这样你就安全了。

关于c++ - 带 C 链接的非外部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6312998/

相关文章:

c - K&R答案1-12(使用函数减少代码行数)

C二进制达到1.2G内存限制

c++ - ld 找不到 opencv highgui 符号(未定义的引用)

c++ - spoj : ONP - Transform the Expression

c++ - 通过删除一些键和一些元素来更新 map 的问题

c++ - 在 gmp 任意精度上生成正态分布

c++ - 多线程。如何平等共享公共(public)资源?

C++ 单例惰性初始化实现和链接似乎有冲突

使用相对路径构建的 boost 库

c++ - 为什么在使用命名空间指令时没有为函数添加命名空间?