2012-08-14 102 views
3

我知道內聯函數是一些函數,它們的主體被插入到被調用的地方。然後在被調用時,爲什麼因此不影響範圍內聯函數的變化:爲什麼內聯函數不能查看內部作用域?

#include <iostream> 

inline void alert(const std::string &str) { cout << str; } 

int main() { 
    using namespace std; 

    alert("Hello World"); // cout << "Hello World"; 
} 

這不工作,因爲我得到的錯誤cout was not declared in this scope,但如果我不std::cout它。爲什麼C++不知道cout是否是std的成員,如果內聯函數的函數體被插入到作用域中的話?

+0

你不會把它改成'std :: cout'嗎?或者在頂部放置'using namespace std;'?似乎對我更好。 – MartyE 2012-08-14 23:44:47

回答

6

您描述的行爲是一個宏。內聯函數是一個常規函數,由編譯器來內聯或不內聯。它的行爲與任何其他與作用域規則相關的函數一樣。

3

因爲C++使用靜態作用域而不是動態作用域。編譯器在函數定義的範圍內查找名稱,而不是函數調用的範圍。

4

因爲它是一個函數,所以它有自己的範圍。使其內聯或不內聯不影響。實際上,inline關鍵字對於外部可見的函數沒有太多的改變,除了它的鏈接。編譯器可以自由選擇是否實際內聯代碼,內聯僅作爲建議。

0

函數的內聯是在鏈接時完成的。在編譯時,C++根本不知道函數是否屬於範圍。因此錯誤被提出。爲了不接受這個錯誤 - 嗯,你必須讓你的內聯函數變成一個宏。

+1

這實際上取決於實現,但內聯可以並且通常在編譯時執行。它也可能在鏈接時執行,但是一些鏈接器是「啞巴」的,並且不能以代碼轉換的方式做很多事情,包括內聯。這就是爲什麼標準要求每個內聯函數在每個TU中都有一個定義,因此不需要鏈接時內聯。 – 2012-08-14 22:18:12

+0

瞭解謝謝 – 2012-08-14 22:40:09