C++ 具有C连接的非外部函数

C++ 具有C连接的非外部函数,c++,c,linkage,C++,C,Linkage,在没有外部链接的情况下,是否可以声明具有C链接的函数?在试图编译时 extern "C" static void f() {} 我明白了 这在某种程度上是有道理的。在命名空间{extern“C”void f(){}中,extern说明符似乎覆盖了匿名命名空间的受限范围 如果这是不可能的,当将函数指针传递给C?< p>时,它是否重要?您可以将函数指针传递给C++非成员或静态成员函数,而不必为C++函数指定一个不同的调用约定,而应该只工作。常规C++函数应该使用C调用约定,这样你就可以在前面做了。

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

extern "C" static void f() {}
我明白了

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


如果这是不可能的,当将函数指针传递给C?

< p>时,它是否重要?您可以将函数指针传递给C++非成员或静态成员函数,而不必为C++函数指定一个不同的调用约定,而应该只工作。常规C++函数应该使用C调用约定,这样你就可以在前面做了。 将指针传递给非静态成员函数并不容易,主要原因是您需要以某种方式传递有关对象的
指针的信息,这通常作为任何成员函数的隐式、不可见参数发生

你能行

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

如果直接在声明中指定
extern“C”
,则标准会指定
extern“C”
也是存储类说明符,因此如果要添加
static
,则会产生冲突

将函数指针传递给C时有关系吗


理论上可以理解,一个允许在行为上不同于调用一个函数,该函数的类型有C++链接,调用一个函数,该函数的类型有C链接。我不知道具体的实现细节,只知道规范是怎么说的。最好遵守规范,你就安全了

我刚刚成功地使用了约翰的答案。谢谢你,伙计

既然我不能(还)评论,但可以回答,让我添加这个数据点

我在
.cpp
中键入了(幸好省略了详细信息:-):

extern“C”{
extern int myfunction();
}
extern int myfunction(){
}
而且:

extern "C" {
    static int myfunction(<the-args>);
}

static int my function(<the-args>) {
    <the-code>
}
extern“C”{
静态int myfunction();
}
静态int my function(){
}
我用两种方法编译,并做了一个:

nm -g <the-file>.o | grep myfuncion
nm-g.o | grep myfunction
依次在两个对象文件上

我观察到,对于extern来说,是一个条目,但是对于静态情况,没有条目


所以现在我很高兴外部的“extern”只是设置了链接,对于静态情况,寻址模式是静态的。

正是我想要的:
对“f”的未定义引用。
;)为什么我没有想到这一点。谢谢“一个允许在行为上不同的实现”——我特别思考的是函数“<代码> char < /C> >参数,以及C规则,这些参数被提升为类型<代码> int <代码>。@ LassMuns哦,这些事情是按照C++法则规定的。也就是说,如果你说“代码>外部”C“无效fE”{}},则C++中不允许调用<代码> f(‘a’)<代码>。因此,这个问题不会出现。如果你说
extern“C”void f(char x){}
,然后调用
f('a')
,它的行为和C中的一样。在C中,
char y='a'调用函数
void f(char x){}
;f(a)
也将
y
作为字符传递,不会发生升级。但是实际传递的参数(即堆栈上的参数分配顺序、寄存器使用等)可能不同。当然,如果您有一个C函数
void f(char x){}
,并将该函数声明为
extern“C”void f(int x) C++中,你做错了——都需要使用<代码> f(char x)< /> >或两者<代码> f(int x)< />代码。或者您需要将C函数定义为
void f(x)char x;{} <代码>(与C++版本兼容<代码> int >代码>)。我已经放了<代码>外部“C”<代码>块,以确保安全。
extern "C" {
    static int myfunction(<the-args>);
}

static int my function(<the-args>) {
    <the-code>
}
nm -g <the-file>.o | grep myfuncion