5

특히 Linux에서 g ++를 사용하면 특정 명령문에 대해 과부하되었거나 템플릿 함수가 선택되었는지 확인할 수 있습니까?컴파일러가 어떤 오버로드 또는 템플릿 함수를 선택했는지 알 수 있습니까?

더 구체적으로 필자는 필연적으로 다양한 라이브러리에서 오는 헤더 파일에있을 수있는 모든 가능한 선택을 알고 있다고 가정하지 않습니다. 그리고 내가 그랬더라도 관련 코드를 수정할 수 있다고 가정하지 않습니다.

+0

http://stackoverflow.com/questions/1496497/how-can-i-see-parse-tree-intermediate-code-optimization-code-and-assembly-code 유용 할 수 있습니다 - 즉, 중간 컴파일러 단계를 살펴보십시오. 만약 이 작업을 한 번만하고 싶으면 생성 된 객체 파일을보고 이해하려는 호출을 둘러싼 "마커"함수 호출을 사용할 수 있습니다. 오브젝트 파일은 호출 한 함수의 심볼 이름을 나타내며 호출 한 함수 서명 (고유해야 함)으로 되돌릴 수 있습니다. – Yakk

+5

필자는 종종 컴파일 타임 디버거가 필요하다고 말하여 템플릿 인스턴스화가 평가 될 때 단계별로 진행하고 템플릿 인수 등을보고 실제 진행 상황을 확인합니다. –

+0

* *를 볼 때, 정확히 무엇을 의미합니까? Clang은 C++ 용으로 완벽하게 구성된 AST를 생성하는 것으로 유명하지만 라이브러리를 둘러 볼 수 있도록 프로그램을 작성해야합니다. –

답변

1

이 작업을 직접 수행하는 방법을 모르겠습니다.

가장 간단한 해결 방법은 호출 지점에서 중단 점을 설정하고 호출되는 함수에 단일 단계를 수행하는 것입니다. 디버거가 어떤 함수를 사용하고 있는지 알려줄 수 있습니다.

Eclipse CDT과 같은 IDE는 오버로드 및 템플릿 해결 자체 (모든 것이 올바르게 작동하는 경우)를 수행 할 수 있으므로 함수 호출을 마우스 오른쪽 버튼으로 클릭하고 함수 선언으로 이동하면 적절한 기능으로 안내합니다.

this answer에 설명 된대로 모호한 함수 호출을 의도적으로 작성하면 사용 가능한 모든 오버로드 및 템플릿 목록을 얻을 수 있으며 거기에서 호출되는 오버로드 및 템플릿을 파악할 수 있습니다.

Matthieu M.가 말한 것처럼, Clang은 dump its AST 일 수있다. 이것은 약간의 해석이 필요하지만 어떤 함수가 호출되는지 알아낼 수 있습니다.

+0

감사. 이클립스가 정말로 그것을 할 수 있다면 나는 감명을 받았고 좋은 해결책이 될 것입니다. –

+0

@ c-urchin - 다양한 소스 및 헤더 파일을 올바르게 인식하기 위해 Eclipse를 사용하는 것은 까다 롭습니다. 특히 복잡한 C++ 코드는 거의 혼동하지 않을 수 있지만 작동하면 매우 좋습니다. –

+0

@c-urchin - MS VS도 할 수 있습니다. 마우스 커서를 함수 이름으로 이동하면 호출 오버로드 함수의 이름과 오버로드 함수의 수를 볼 수 있습니다. 나는 현대 IDE가 그것을해야한다고 생각한다. – SergV

1

부분적인 대답.

당신은 런타임 (++ GNU C를 들어 Macro/keyword which can be used to print out method name?

에서 함수의 이름을 인쇄하기 위해 비 표준 매크로를 사용할 수 있습니다

이 코드 ( http://ideone.com/PI39qK)에서
#include <iostream> 
using namespace std; 
template <typename T> 
void f(const T & t) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(const string &) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
void f(int) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 
int main() 
{ 
    f(1.0); 
    f(1); 
    f(string("sss")); 
    string a; 
    f(a); 
} 

출력 :

void f(int) 
void f(int) 
void f(const std::string&) 
void f(T&) [with T = std::string] 
+0

고마워,하지만 내가 말했듯이 내가 소스 코드를 수정할 수 있다고 가정하지 못한다. 또는 어떤 코드가 어떤 #include 파일 (모든 레벨에서) –