일부 C 코드에서 동일한 함수 세트가 동일한 서명을 갖고 있는지 확인하고자합니다. 이상적으로는 함수의 반환 값과 인수를 설명하는 새 형식을 정의한 다음이 새 형식을 사용하여 함수 집합을 선언 할 수 있습니다.C에서 함수 선언 집합에 함수 서명을 적용하려면 어떻게합니까?
또한이 함수의 인수에 대한 기본값을 지정하는 방법이 있습니까?
일부 C 코드에서 동일한 함수 세트가 동일한 서명을 갖고 있는지 확인하고자합니다. 이상적으로는 함수의 반환 값과 인수를 설명하는 새 형식을 정의한 다음이 새 형식을 사용하여 함수 집합을 선언 할 수 있습니다.C에서 함수 선언 집합에 함수 서명을 적용하려면 어떻게합니까?
또한이 함수의 인수에 대한 기본값을 지정하는 방법이 있습니까?
/* 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에 대한 자세한 세부 사항을 모른 채 무언가를 제안 어려울 것이다 당신이 성취하려고 노력하는 것. 결과가 꽤 해커 일 가능성이 높습니다.
이 함수 포인터가 작동하는 방식과 유사합니다
// 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;
내가 직접이 작업을 수행 할 수 있다고 생각하지 않습니다,하지만 당신은 함수 포인터 타입을 선언 할 수 다음 배열로 모든 기능을 수집합니다. 컴파일러는 어느 것이 일치하지 않는지 알려줍니다.
typedef void (*MethodSig)(int, int);
static MethodSig x[] = { fnA, fnB, ... };
또는 함수 서명
#define MyFunc(X) void X(int a, int b)
에게 그들은 모두 동일합니다 그 방법을 선언하는 매크로를 사용합니다.
실제로 누군가가 서명을 갖고있는 함수를 만들 수는 없습니다. 그러나 당신은 당신이 부르는 것을 통제 할 수 있습니다. 그래서 나는 그것이 당신이 원하는 것이라고 생각합니다.
임의의 함수를 호출하는 함수가 함수의 포인터를 매개 변수로 사용하는지 확인하십시오.당신은 타입 정의를 언급 한 이후, 당신과 같이, 프로그램에 이전 타입 정의를 정의 할 수 있습니다 :
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);
다음은 간단한 문자열에 매핑 된 함수 목록을 만드는 예제입니다.
먼저 형식 정의 :
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++;
}
죄송합니다 그것이 있다면 비트 '원시'. 코드에서 똑바로 붙여 넣었습니다 .--)
와우, 그런 식으로는 사용하지 않았습니다. 포인터 만 함수 포인터로 사용했습니다. 그 function_t를 함수 정의로 재사용 할 수 있습니까? – quinmars
아니요, 정의에 전체 서명을 사용해야하지만 일치해야합니다. –
명확히하기 : 함수 프로토 타입에 typedef를 사용하지만 함수 정의를 정상적으로 선언하십시오. 정의가 프로토 타입과 일치하지 않으면 컴파일러 또는 링커 오류가 발생합니다. –