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

4

4 に答える 4

6

あなたが説明している振る舞いはマクロです。インライン関数は通常の関数であり、インライン化するかどうかはコンパイラー次第です。スコープ規則に関しては、他の関数とまったく同じように動作します。

于 2012-08-14T20:08:52.637 に答える
4

関数であるため、独自のスコープがあります。インラインにするかどうかは影響しません。実際、インラインキーワードは、リンクを除いて外部から見える関数についてはあまり変わりません。コンパイラーは、コードを実際にインライン化するかどうかを自由に選択できます。インライン化は提案としてのみ使用されます。

于 2012-08-14T20:07:58.927 に答える
3

C ++は動的スコープではなく、静的スコープを使用するためです。コンパイラーは、関数が呼び出される場所のスコープではなく、関数が定義されている場所のスコープで名前を検索します。

于 2012-08-14T20:07:58.353 に答える
0

関数のインライン化はリンク時に行われます-時間。コンパイル時に、C ++は、関数がスコープ内にあるかどうかをまったく認識していません。したがって、エラーが発生します。このエラーを受け取らないようにするには、代わりにインライン関数をマクロにする必要があります。

于 2012-08-14T20:14:18.880 に答える