2012-08-14 2 views
3

인라인 함수는 본문이 호출되는 곳으로 삽입되는 함수라는 것을 알고 있습니다. 그들이 호출 할 때 그런 이유 때문에 범위에 영향을 인라인 기능 변경되지 않습니다인라인 함수가 범위 내부를 볼 수없는 이유는 무엇입니까?

#include <iostream> 

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

int main() { 
    using namespace std; 

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

I 오류 cout was not declared in this scope를 얻을 수 있기 때문 작동하지 않습니다,하지만 난 std::cout을 할 경우는 않습니다. 인라인 함수의 함수 본문이 범위에 삽입되면 coutstd의 멤버라는 것을 C++에서 알 수없는 이유는 무엇입니까?

+0

'std :: cout'으로 변경하지 않겠습니까? 또는 상단에'using namespace std; '를 넣으시겠습니까? 나에게 더 좋은 모양 같아. – MartyE

답변

6

설명하는 동작은 매크로입니다. 인라인 함수는 일반적인 함수이며 컴파일러가 인라인하지 못하도록합니다. 이는 스코프 규칙과 관련하여 다른 모든 기능과 정확히 동일하게 작동합니다.

3

C++은 동적 범위 지정을 사용하기 때문에 정적 범위 지정을 사용하기 때문에. 컴파일러는 함수가 정의 된 범위 내에서 이름을 조회하지만 함수가 호출되는 범위는 조회하지 않습니다.

4

기능이기 때문에 자체 범위가 있습니다. 인라인으로 만들지 않더라도 영향을 미치지 않습니다. 사실 인라인 키워드는 링크를 제외하고는 외부에서 볼 수있는 함수에 대해서는 많이 변하지 않습니다. 컴파일러는 실제로 코드를 인라인할지 어떨지를 자유롭게 선택할 수 있으며, 인라인은 제안으로 만 사용됩니다.

0

링크 인라인 중에 함수의 인라인이 수행됩니다. 컴파일 타임에 C++은 모든 기능이 범위 내에 있는지 전혀 모른다. 따라서 오류가 발생합니다. 이 오류를받지 않으려면 인라인 함수를 대신 매크로로 만들어야합니다.

+1

구현에 달려 있지만 인라인은 일반적으로 컴파일 타임에 수행됩니다. 링크 타임에 수행 될 수도 있지만 일부 링커는 "벙어리"이며 인라인을 포함하는 코드 변환 방법으로는 많은 작업을 수행 할 수 없습니다. 그렇기 때문에 표준에서는 모든 인라인 함수가 사용되는 각 TU에 정의를 요구하므로 링크 타임 인라인을 실제로 사용할 필요가 없습니다. –

+0

감사합니다. –

관련 문제