>  기사  >  백엔드 개발  >  C 언어에서 프로그래밍 방식으로 함수 이름 가져오기

C 언어에서 프로그래밍 방식으로 함수 이름 가져오기

黄舟
黄舟원래의
2016-12-16 09:40:171644검색

단지 함수 이름을 얻으려면 함수 본문에 하드 코딩된 문자열을 삽입하는 것이 지루하고 쉽게 오류가 발생할 수 있습니다. 프로그램이 실행 중입니다.

객체 리플렉션 라이브러리, 디버깅 도구 및 코드 분석기는 런타임 시 함수 이름에 액세스해야 하는 경우가 많습니다. 최근까지 이 작업을 수행하는 유일한 이식 가능한 방법은 함수 본문에 수동으로 삽입하는 것이었습니다. -함수 이름이 포함된 문자열. 말할 필요도 없이 이 접근 방식은 매우 지루하며 쉽게 오류가 발생할 수 있습니다. 이 기사에서는 새로운 C99 기능을 사용하여 런타임에 함수 이름을 얻는 방법을 보여줍니다.

그렇다면 현재 실행 중인 함수에서 함수 이름을 프로그래밍 방식으로 어떻게 가져오나요?

대답은 __FUNCTION__ 및 관련 매크로를 사용하는 것입니다.

질문으로 이어짐

종종 디버깅에서 가장 실망스러운 단계는 특정 함수가 호출되었는지 지속적으로 확인하는 것입니다. 이 문제에 대한 해결책은 일반적으로 cout 또는 PRintf()를 추가하는 것입니다. C 언어를 사용하는 경우 다음과 같이 합니다.

void myfunc()
{
cout<<" myfunc() "<//기타 코드
}
보통 일반적인 프로젝트에는 수천 개의 함수가 있는데, 각 함수마다 이런 줄을 추가해야 합니다. 출력문은 의심할 여지가 없습니다. "Shu Mountain"으로 이동하기 어렵습니다. 따라서 이 작업을 자동으로 완료하는 메커니즘이 필요합니다.

함수 이름 가져오기

C++ 프로그래머로서 __TIME__, __FILE__ 및 __DATE__와 같은 매크로는 컴파일 중에 컴파일 시간과 처리를 포함하는 매크로로 변환되는 경우가 많습니다. 단위 이름과 현재 시간을 변환하는 기능입니다.

C99로 알려진 최신 ISO C 표준에는 액세스 중인 함수 이름을 수정되지 않은(즉, untrimmed ) 보고하는 또 다른 유용한 매크로와 유사한 표현식 __func__이 추가되었습니다. __func__은 매크로가 아닙니다. 대신 전처리기가 이 함수에 대해 아무것도 모르기 때문에 암시적으로 선언된 상수 문자 배열로 구현됩니다.

static const char __func__[] = "function-name";
여기서 function-name은 실제 함수 이름입니다. 이 기능을 활성화하려면 일부 컴파일러에 특정 컴파일 플래그가 필요합니다. 특정 정보는 해당 컴파일러 설명서를 확인하세요.

이를 사용하면 함수 이름을 표시하기 위해 수동으로 수정하는 고된 작업을 대부분 피할 수 있습니다.

void myfunc()
{
cout}
이 목적을 위해 공식 C99 표준에 의해 정의된 __func__ 식별자는 실제로 모든 사람의 관심을 끌 만한 가치가 있습니다. 그러나 ISO C++ 모든 C99 확장이 완전히 지원되는 것은 아닙니다. 이므로 대부분의 컴파일러 공급업체는 일반적으로 __func__로 정의된 매크로인 __FUNCTION__을 사용합니다. 이 이름은 대부분의 널리 지원되는 항목에서 사용되었기 때문입니다.

Visual Studio 2005에서는 이 기능이 기본적으로 활성화되어 있지만 /EP 및 /P 컴파일 옵션과 함께 사용할 수 없습니다. IDE 환경에서는 __func__을 인식할 수 없으므로 __FUNCTION__으로 바꿔야 합니다.

Comeau 사용자는 __func__ 대신 __FUNCTION__을 사용해야 합니다.

C++ BuilderX 사용자는 __FUNC__라는 약간 다른 이름을 사용해야 합니다.

GCC 3.0 이상에서는 __func__ 및 __FUNCTION__을 모두 지원합니다.

현재 함수 이름을 자동으로 얻을 수 있게 되면 다음과 같이 함수 이름을 표시하는 함수를 정의할 수 있습니다.

void show_name(const char * name)
{
cout< ;}

void myfunc()
{
show_name(__FUNCTION__) ​​//출력: myfunc
}

void foo()
{
show_name(__FUNCTION__); ​​​​//Output: foo
}
__FUNCTION__은 함수 중괄호가 시작된 직후에 초기화되므로 foo() 및 myfunc ( ) 함수는 오버로드 걱정 없이 매개변수 목록에서 안전하게 사용할 수 있습니다.

서명 및 수정된 이름

__FUNCTION__ 기능은 원래 C 언어용으로 설계되었지만 C++ 프로그래머는 해당 기능에 대한 추가 정보가 필요한 경우가 종종 있으며 Visual Studio 2005에서도 지원됩니다. 두 가지 비표준 확장 기능인 __FUNCDNAME__ 및 __FUNCSIG__는 각각 함수의 수정된 이름과 서명으로 변환됩니다. 수정된 함수 이름은 예를 들어 두 컴파일러가 동일한 ABI를 공유하는지 확인하려는 경우 매우 유용합니다. 또한 모호한 링크 오류를 해결하고 C++로 링크된 DLL에서 다른 함수를 호출하는 데도 도움이 될 수 있습니다. . 다음 예에서 show_name()은 함수의 수정된 이름을 보고합니다.

void myfunc()
{
show_name(__FUNCDNAME__) //출력: ?myfunc@@YAXXZ
}
함수의 시그니처는 함수 이름, 매개변수 목록, 반환 유형 및 포함된 네임스페이스로 구성됩니다. 멤버 함수인 경우 해당 클래스 이름과 const/휘발성 한정자도 시그니처의 일부가 됩니다. 다음 코드는 독립 함수와 const 멤버 함수의 서명 차이점을 보여줍니다. 두 함수의 이름, 반환 유형 및 매개 변수는 정확히 동일합니다.

void myfunc()
{
show_name(__FUNCSIG__); // void __cdecl myfunc(void)
}

strUCt S
{
void myfunc() const
{
show_name(__FUNCSIG__ ); //void __thiscall S::myfunc(void) const

}
};

위 내용은 C 언어에서 프로그래밍 방식으로 함수 이름을 얻는 내용입니다. PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.