2013-03-11 2 views
18

호출 할 함수의 이름을 표시하고 싶습니다. 여기에 내 코드함수 이름을 문자열로 가져옵니다.

void (*tabFtPtr [nbExo])(); // Array of function pointers 
int i; 
for (i = 0; i < nbExo; ++i) 
{ 
    printf ("%d - %s", i, __function__); 
} 

그것이 내가 원하는 것과 아주 가까이 있기 때문에 내가 exemple로 __function__을 사용하지만, 나는 tabFtPtr [nbExo]가 가리키는 함수의 이름을 표시합니다. 저를 도와 주셔서

감사합니다 :)

+1

C++ 버전 @ http://stackoverflow.com/q/679021/139010 –

+0

. 어떤 컴파일러를 사용하고 있습니까? –

+3

C의 함수 포인터에서 함수의 이름을 얻는 방법 http://stackoverflow.com/questions/351134/how-to-get-functions-name-from-functions-pointer-in-c – zzk

답변

19

나중에 C99 표준 또는 다음과 C 컴파일러가 필요합니다. 당신이 요구하는대로 __func__이라는 미리 정의 된 식별자가 있습니다.

void func (void) 
{ 
    printf("%s", __func__); 
} 

편집 :

void func (void) 
{ 
    static const char f [] = "func"; // where func is the function's name 
    printf("%s", f); 
} 

편집 2 : 호기심 참고로

는 C 표준 6.4.2.2 명시 적으로 쓴 것처럼 위의 정확히 같은 것을 지시 :

그래서 함수 포인터를 통해 이름을 얻으려면 다음과 같이 구성 할 수 있습니다.

const char* func (bool whoami, ...) 
{ 
    const char* result; 

    if(whoami) 
    { 
    result = __func__; 
    } 
    else 
    { 
    do_work(); 
    result = NULL; 
    } 

    return result; 
} 

int main() 
{ 
    typedef const char*(*func_t)(bool x, ...); 
    func_t function [N] = ...; // array of func pointers 

    for(int i=0; i<N; i++) 
    { 
    printf("%s", function[i](true, ...); 
    } 
} 
+0

함수 포인터에서 해당 문자열을 가져올 수 없습니까? –

+0

@CarlNorum 단순히 함수를 호출하십시오. 이 함수는 어떻게 든 __func__ 식별자를 통합해야합니다. – Lundin

+2

이것이 OP의 질문과 어떻게 통합 될 수 있는지 전혀 모르겠습니다. 그게 전부입니다.그는 함수를 호출하는 것처럼 보이지 않고 런타임에 이름을 가져옵니다. –

1

나는 이것이 당신이 원하는 것이라고 확신하지 못하지만, 이렇게 할 수 있습니다.

#define FNUM 3 

struct fnc { 
    void *addr; 
    char name[32]; 
}; 

void (*f[FNUM])(); 
struct fnc fnames[FNUM]; 

수동 함수 이름, 예컨대하여 코드에서 이러한 초기화한다 : 함수 이름, 주소 및 파일 범위 함수의 어레이를 유지하도록하는 구조를 선언

fnames[0] = (struct fnc){foo1, "foo1"}; // function address + its name 
    fnames[1] = (struct fnc){foo2, "foo2"}; 
    fnames[2] = (struct fnc){foo3, "foo3"}; 

배열을 검색하는 함수를 만듭니다.

char *getfname(void *p) 
{ 
     for (int i = 0; i < FNUM; i++) { 
       if (fnames[i].addr == p) 
         return fnames[i].name; 
     } 
     return NULL; 
} 

나는 이것을 신속하게 테스트했다. main에 배열을 초기화하고 foo1()을 호출했습니다. 여기 내 기능, 그리고 출력 :

void foo1(void) 
{ 
    printf("The pointer of the current function is %p\n", getfnp(__func__)); 
    printf("The name of this function is %s\n", getfname(getfnp(__func__))); 
    printf("The name of the function at pointer f[2] (%p) is '%s'\n", f[2], 
     getfname(f[2]));  
} 

The pointer of the current function is 0x400715 
The name of this function is foo1 
The name of the function at pointer f[2] (0x40078c) is 'foo3' 

또는 더 일반적으로 :

이 일을의 표준 방법은 없습니다
void foo2(void) 
{ 
    for (int i = 0; i < FNUM; i++) { 
     printf("Function f[%d] is called '%s'\n", i, getfname(f[i])); 
    } 
} 

Function f[0] is called 'foo1' 
Function f[1] is called 'foo2' 
Function f[2] is called 'foo3' 
+0

성능면에서 이것은 아마도 함수에 추가적인 오버 헤드를 추가하지 않기 때문에 더 나은 해결책 일 것입니다. –

관련 문제