을 나는 이것이 당신이 원하는 가까이있을 수 있다고 생각하지만, 나는 확신 할 수 없다. 내 생각에 유형이 검사되고 컴파일 타임에 제거 될 수있는 임의의 수의 인수를 가진 c 함수를 허용하는 것이 아이디어이다.
아래에서 표준을 인용하여 식별자의 점수 예약 된 식별자로 실행할 수 있습니다. 그러나, 이것의 가능성은 나에게 알려지지 않았다.
ISO/IEC 9899 : 1999 (E) 7.1.3
- 밑줄과 대문자 문자 또는 다른 밑줄로 시작하는 모든 식별자는 항상 사용하기 위해 예약 있습니다.
이 솔루션에는 GCC가 필요합니다. GCC 버전은 약한 기호도 지원해야합니다. 아이디어는 컴파일러가 약한 기호를 사용하여 올바른 함수 정의를 찾도록 허용하는 것입니다. 또한 함수의 내용은 즉, 컴파일러가 죽은 가지를 가지 치기해야 지식을 사용하여 단순화 :
if (0) { ... }
을 추가 분석 (GCC 4.x를 확실하게이 작업을 수행)하지 않고 컴파일시. 존재하지 않는 선택적 매개 변수를 c 전처리 기 (cpp) 기호로 정의하면 함수 본문에 cpp 조건부가있는 것을 피할 수 있습니다 (필요한 경우). 아래의 f_opt0에 대해 opt1 및 opt2가 정의 된 방법을 확인하십시오.
#include <assert.h>
#include <stdio.h>
extern void f_opt0(int a, int b) __attribute__((weak));
extern void f_opt1(int a, int b, int opt1) __attribute__((weak));
extern void f_opt2(int a, int b, int opt1, int opt2) __attribute__((weak));
#ifdef OPT0
void f_opt0(int a, int b) {
#define opt1 0
#define opt2 0
#endif
#ifdef OPT1
void f_opt1(int a, int b, int opt1) {
#define opt2 0
#endif
#ifdef OPT2
void f_opt2(int a, int b, int opt1, int opt2) {
#endif
if (opt1) printf("opt1=%d\n", opt1);
if (opt2) printf("opt2=%d\n", opt2);
printf("a+b=%d\n", a+b);
#undef opt1
#undef opt2
}
#define f(a, b, o1, o2) \
if (f_opt2) f_opt2(a, b, o1, o2); \
else if (f_opt1) f_opt1(a, b, o1); \
else if (f_opt0) f_opt0(a, b); \
else { assert(0 && "no f() defined!"); }
int main(void) {
f(1, 2, 1, 1);
return 0;
}
내 테스트는 매우 제한적이었고, 나는이 문제에 경향이 보이고 이해하기 곤란하다 C.이 좋은 디자인을 옹호하지 않습니다. 그러나 그것이 당신의 목표를 만족 시키길 바랍니다.
가변 인수 기능을 사용 하시겠습니까? http://en.wikipedia.org/wiki/Varargs#Variadic_functions_in_C.2C_Objective-C.2C_C.2B.2B.2C_and_D – Inshallah
분명히 나는 그들을 원하지 않는다!^_^나는 이미 그것들을 사용했고 정적 유형 검사를 잃는 것에 대해 매우 걱정하고 있습니다. – fortran
아마도 나는 뭔가를 놓치고 있지만 이것은 나에게 좋을 것 같습니다. 여분의 복잡성은 어디에 있습니까? 그리고 그것은 무엇이 중첩 된 것입니까? –