기능 주소는 대괄호가있는 이름입니다. 그러나, 내가 주소를 인쇄하는 데 사용하는 경우, 그것은 잘못되었습니다. 함수를 가정함수 주소를 얻는 방법은 무엇입니까?
는"INT의 function_address()"및 코드
cout<<function_address<<endl;
기능 주소는 대괄호가있는 이름입니다. 그러나, 내가 주소를 인쇄하는 데 사용하는 경우, 그것은 잘못되었습니다. 함수를 가정함수 주소를 얻는 방법은 무엇입니까?
는"INT의 function_address()"및 코드
cout<<function_address<<endl;
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도 참조하십시오.
하지만 "ptr = func_name;"코드는 실제로 일할 수 있습니다 –
하지만 함수 이름을 계산하지 않습니다. –
@MichaelTsai 이는 단순한 암시 적 변환입니다.컴파일러는 그것을'ptr = & func_name;' – KABoissonneault
C++ 태그 (및 아마도 C++ 11)가 누락되었습니다. –