2015-12-09 46 views

回答

3

extern "C"鏈接時指令。它不會改變語言本身的工作方式。

因爲A a();正在爲不帶參數的函數聲明函數原型並返回A,所以在您的情況下不會調用析構函數。它確實不是創建一個A的實例。 (見最令人頭痛的解析)。

如果您已經編寫A a;,則默認的構造函數將與a超出作用域的析構函數一起被調用。

2

功能的語言聯動對功能的語義沒有影響。它隻影響在程序中看到名字的方式。

您的函數按預期行爲。 (雖然your expectations may differ從你寫的。)

2

extern "C"限定隻影響函數如何被調用並對函數簽名施加一些約束。它不影響其實施。也就是說,如果你的函數中有一個對象,它將被構造和銷燬。

當然,在問題的代碼中實際上沒有創建對象,因爲A a();是函數聲明。如果要真正地創建一個對象,並調用它的默認構造函數,你會使用,例如,下面的定義之一:

A a1 = A(); 
A a2{}; 
2

這樣的問題可以在家裏通過建立一個小的測試程序來回答:

#include <iostream> 

struct A 
{ 
    ~A() { std::cout << __func__ << std::endl; } 
}; 

extern "C" { 
    int func() 
    { 
     A a; // a is object of class A 
     return 0; 
    } 
} 

int main() 
{ 
    func(); 
    return 0; 
} 

預期輸出:

~A 

答:是

相關問題