2008-10-09 5 views

답변

13
/* define a typedef for function_t - functions that return void */ 
/*  and take an int and char parameter */ 

typedef void function_t(int param1, char param2); 

/* declare some functions that use that signature */ 

function_t foo; 
function_t bar; 

이제 함수를 정의 할 때 typedef에서와 동일한 서명을 사용하지 않으면 오류가 발생합니다. 새로운 질문으로

void foo(int x, char c) 
{ 
    /* do some stuff */ 

    return; 
} 

/* this will result in a compiler error */ 
int bar(int x, char c) 
{ 
    /* do some stuff */ 

    return 1; 
} 

은 (10월 8일 20 추가) : "또한이 기능 형식 정의의 인수에 대한 기본 값을 지정하는 방법이?"

아니요, typedef에 기본 매개 변수를 추가 할 방법이 없습니다. C에서 기본 매개 변수를 전혀 지원하지 않습니다. C++에서도 매개 변수의 기본값이 형식의 일부가 아니기 때문에이 작업을 수행 할 수 없습니다. 사실, 기본 클래스의 가상 메서드를 재정의하는 클래스는 기본 매개 변수에 대해 다른 값을 지정할 수 있습니다 (또는 기본값을 모두 제거 할 수도 있음). 그러나 이것은 단순히 혼동을 일으킬 수 있으므로 일반적으로 수행해서는 안되는 작업입니다 (http://www.gotw.ca/gotw/005.htm).

다음 당신이 중 하나를 사용하여 원하는 동작 (또는 조합)를 얻을 수있을 ++ C 사용하는 경우 :

  • 템플릿 함수를 오버로드

    • 추상 기본 클래스
    • 매크로

    하지만 exac에 대한 자세한 세부 사항을 모른 채 무언가를 제안 어려울 것이다 당신이 성취하려고 노력하는 것. 결과가 꽤 해커 일 가능성이 높습니다.

  • +0

    와우, 그런 식으로는 사용하지 않았습니다. 포인터 만 함수 포인터로 사용했습니다. 그 function_t를 함수 정의로 재사용 할 수 있습니까? – quinmars

    +0

    아니요, 정의에 전체 서명을 사용해야하지만 일치해야합니다. –

    +0

    명확히하기 : 함수 프로토 타입에 typedef를 사용하지만 함수 정의를 정상적으로 선언하십시오. 정의가 프로토 타입과 일치하지 않으면 컴파일러 또는 링커 오류가 발생합니다. –

    0

    이 함수 포인터가 작동하는 방식과 유사합니다

    // Declaration of function with int arg returning int 
    typedef int (*CALLBACK)(int); 
    
    //Definition 
    int myFunc(int arg) 
    { 
        return 0; 
    } 
    
    // Function pointer usage 
    CALLBACK pFunc = myFunc; 
    
    0

    내가 직접이 작업을 수행 할 수 있다고 생각하지 않습니다,하지만 당신은 함수 포인터 타입을 선언 할 수 다음 배열로 모든 기능을 수집합니다. 컴파일러는 어느 것이 일치하지 않는지 알려줍니다.

    typedef void (*MethodSig)(int, int); 
    
    static MethodSig x[] = { fnA, fnB, ... }; 
    

    또는 함수 서명

    #define MyFunc(X) void X(int a, int b) 
    

    에게 그들은 모두 동일합니다 그 방법을 선언하는 매크로를 사용합니다.

    0

    실제로 누군가가 서명을 갖고있는 함수를 만들 수는 없습니다. 그러나 당신은 당신이 부르는 것을 통제 할 수 있습니다. 그래서 나는 그것이 당신이 원하는 것이라고 생각합니다.

    임의의 함수를 호출하는 함수가 함수의 포인터를 매개 변수로 사용하는지 확인하십시오.당신은 타입 정의를 언급 한 이후, 당신과 같이, 프로그램에 이전 타입 정의를 정의 할 수 있습니다 :

    typedef unsigned short (*id_for_allowed_functions)(int, char*); 
    
    :

    당신 만 서명 "서명되지 않은 짧은 id_for_allowed_functions (INT의 X, 숯불 * y를)"의 기능을한다고 가정

    그런 다음 호출 기능 :

    void calling_function (id_for_allowed_function x) { (*x)(3, "bla"); } 
    

    그리고 그것에 함수 foo를 공급 :

    unsigned short foo(int x, char* y) { /* ... */ } 
    calling_function(&foo); 
    
    0

    다음은 간단한 문자열에 매핑 된 함수 목록을 만드는 예제입니다.

    먼저 형식 정의 :

    typedef GenList *(*DBLISTLOADER)(Database *pDB, char *quellCD, char *profilName); 
    typedef ObjDescription *(*DBCOLUMNLOADER)(); 
    
    typedef struct dbinfo 
    { 
        char *dbName; 
        DBLISTLOADER dbListLoader; 
        DBCOLUMNLOADER dbColumnLoader; 
        char *options; 
    } DBINFO; 
    

    그런 다음 매핑 테이블 :

    이제
    DBINFO dbInfoList[] = 
    { 
        { "SRCDOC", loadSRCDOC,  colSRCDOC,  "q" }, 
        { "PRF_CD", loadPRF_CD,  colPRF_CD,  "" }, 
        { "MEDIA", loadMEDIA,  colMEDIA,  "" }, 
    
        { NULL,  NULL,   NULL } 
    }; 
    

    그 테이블에서 함수를 조회하고 전화 :

    while (dbInfoList[i].dbName != NULL) 
    { 
        if (strcmp(dbInfoList[i].dbName, szDatabase) == 0) 
        { 
         return (dbInfoList[i].dbListLoader)(pDB, quellCD, profilName); 
        } 
    
        i++; 
    } 
    

    죄송합니다 그것이 있다면 비트 '원시'. 코드에서 똑바로 붙여 넣었습니다 .--)