2011-04-24 46 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?)已經在某處定義。

參數沒有名稱不是問題,因爲這是一個函數的聲明:它只用於讓編譯器知道函數的簽名(參數的數量和類型,以及返回類型)。如何命名形式參數並不重要(或者它們是否被命名)。該信息僅在您即將編寫函數體時纔有用。