2016-12-21 7 views
0

기능 주소는 대괄호가있는 이름입니다. 그러나, 내가 주소를 인쇄하는 데 사용하는 경우, 그것은 잘못되었습니다. 함수를 가정함수 주소를 얻는 방법은 무엇입니까?

"INT의 function_address()"및 코드

cout<<function_address<<endl; 
+0

C++ 태그 (및 아마도 C++ 11)가 누락되었습니다. –

답변

2

b를 함수의 주소 브래킷

함수의 주소와 이름 등이다 아니요,의 이름입니다. 예를 들어, 0x0000000000020d57 (Linux에서는 프로그램을 실행하는 프로세스의 virtual address space에서 nm을 사용하여 전역 기능의 주소를 얻을 수 있음) 기능 은 런타임에 잊어 버리고 (예외는 dynamic linking과 관련이 있으며 그 개념은 표준 C++에는 없지만 구현과 관련됩니다). 심지어 strip 실행 파일의 기호 테이블 수 있습니다. 함수 이름은 컴파일 타임과 링크시에만 중요합니다.

일반적으로 주소에서 함수 이름을 가져올 수 없습니다.

C++11에서 물론

, 당신은 단지 함수 이름으로 식을 때 (예를 들어, 지수 std::exp) 그 표현은 값으로 함수의 주소 있습니다. 또는 예를 들어 :

extern void fun(int); /// declare the function fun, defined elsewhere. 
auto fp = fun; 

fp는 하나 개의 인수, 정수를 복용 함수에 대한 포인터이며, 그 아무것도 (무효)를 반환하지 않습니다. fun처럼이 포인터 fp은 함수의 주소 (하지 이름) 및 기능 재미의 주소 (와 포인터 fun의 초기화) 컴파일러 및 링커 예 빌드 시간 (에 완료를 보유하고 런타임에는 아무 것도 발생하지 않음). 따라서 std::cout << fp << std::endl은 부울 플래그 (이름이 아님)를 출력합니다. 그러면 std::cout << fun << std::endl도 마찬가지입니다. 그리고 std::cout << (void*)fp << std::endl은 일부 주소를 출력합니다.

기호 (예 : 기능 이름)에 대해 더 자세히 이해하려면 Levine의 Linkers and loaders 책을 읽어보십시오. 당신이 함수 주소의 (mangled) 이름을 가져 dladdr(3)를 사용할 수 있습니다

특히 리눅스에

, (그것이 어떤 ELF 파일에 일부 글로벌 이름을 가지고 가정, 당신은 strip 바이너리를하지 않았다, 그리고 적절한 옵션과 연결 - 예 : -rdynamic).

C++ 11에서 일부 함수에는 이름이 없으며 일부 함수에는 전역 이름이 없을 수 있습니다. lambda expressions & closures에 대해 읽어보십시오. std::function도 참조하십시오.

+0

하지만 "ptr = func_name;"코드는 실제로 일할 수 있습니다 –

+0

하지만 함수 이름을 계산하지 않습니다. –

+1

@MichaelTsai 이는 단순한 암시 적 변환입니다.컴파일러는 그것을'ptr = & func_name;' – KABoissonneault

관련 문제