2011-04-24 75 views
2
extern "C" int func(int *, Foo); 

这是来自类的示例代码。但我不明白界面是如何工作的,一个没有变量名,另一个没有类型。这是如何工作的?c函数接口问题

回答

6

声明函数时不需要指定参数名称,只是一个类型。 Foo在这种情况下是一种类型。

extern "C"告诉编译器它应该使用一个C风格的符号,这或多或少意味着它不会使用名称修饰(C++使用它来允许多个函数共享一个名称,但使用不同的参数集或名称空间) 。

+1

此外,您不能有两个'extern“C”'重载相同的函数名称。 – zneak 2011-04-24 14:58:51

1

这是一个函数声明。你不需要有一个变量名。 第二个确实有一个类型,它是Foo。

2

一个没有变量名,另一个没有类型。这是如何工作的?

在函数声明中(甚至在定义中),变量名是可选的,在你的情况下,Foo是一个类型,它不是变量名!

即使功能f没有提及参数名称,以下程序也是完全有效的!

int f(int) 
{ 
    cout << "f(int) is called"; 
} 
int main() 
{ 
    f(100); 
} 
1

这只是一个prototype。也就是说,调用该函数需要什么,但不包含说明函数实际执行的代码。

所有编译器需要知道的生成调用代码的函数的参数类型,函数名称和返回类型。它不需要知道参数的名称。第二个参数是Foo。这不是名称,那是类型。

1

通过使用extern“C”您可以将C++程序链接到C函数。

在你上面的例子中,它将关闭名称mangling for func,以便您可以链接到由C编译器编译的代码。

C++编译器需要使用名称修饰来区分具有相同名称的不同功能。名称修改是C++在调用链接器之前将函数名称更改为函数签名的规则。

0

你的假设是不正确的:这两个参数有自己指定的,他们都没有指定的。在这种情况下Foo是一种类型(struct?)已经在某处定义。

参数没有名称不是问题,因为这是一个函数的声明:它只用于让编译器知道函数的签名(参数的数量和类型,以及返回类型)。如何命名形式参数并不重要(或者它们是否被命名)。该信息仅在您即将编写函数体时才有用。