2012-06-29 3 views
0

를 작동하는 방법 :
void func(int a, int b, char s, FILE *fp, int flag)
을하고 난 플래그에 따라 함수의 인수를 사용하고 싶습니다. 예를 들어 :
func(num, NOTHING, NOTHING, file, 1)
func(num, othernum, NOTHING, NOTHING, 2)
및 기능 this_is_function에 내가 갖고 싶어 :
일부 인수 내가이 기능이 C

void func(int a, int b, char s, FILE *fp, int flag){ 
if(flag == 1){ 
/* use a and file */ 
} 
if(flag == 2){ 
/* use a,b */ 
} 
/* etc etc */ 
} 

내가이 작업을 수행 할 수 어떻게 있는지 알고 싶습니다!
미리 감사드립니다.

+1

함수에 전달 된 모든 인수를 사용할 필요가 없으므로 코드가 정상입니다. – perreal

+0

이것은 C++ 질문이 아니지만 C++에서 [boost :: optional] (http : //www.boost.이 기능을 제공하는 org/doc/libs/1_50_0/libs/optional/doc/html/boost_optional/examples.html # boost_optional.examples.optional_return_values)를 사용하고 있다면 "NOTHING" boost :: none' (이는 프로젝트의 다른 이름과 충돌하지 않는다면 쉽게 'none'과 같을 수 있습니다). – HostileFork

답변

2

당신은 포인터에 대한 intcharNULL0를 전달할 수 있습니다.

func(num, 0, 0, file, 1) 
func(num, othernum, 0, NULL, 2) 

가변 인수 기능을 사용할 수도 있습니다. Variadic 함수는 가변 개수의 인수를 갖는 함수입니다.

+0

예,이 소리는 간단하고 좋다 :) 감사합니다. – polslinux

4

NOTHING에 의해 정말로 그 논증을 생략하고 싶다는 뜻이라면, 당신이 그 윤곽을 그렸던 것처럼 가능하지 않다고 생각합니다.

일반적으로 C에서 수행되는 방식은 variable argument lists입니다.

void func(int flag, ...) 
{ 
    va_list args; 
    int num, othernum; 
    FILE *file; 

    va_start(args, flag); 
    if(flag == 1) 
    { 
    num = va_arg(args, int); 
    file = va_arg(args, FILE *); 
    } 
    else if(flag == 2) 
    { 
    num = va_arg(args, int); 
    othernum = va_args(args, int); 
    } 
    va_end(args); 

    /* Inspect `flag` again, and do things with the values we got. */ 
} 

는 그런 다음과 같이 기능을 사용할 수 있습니다 :

func(1, 42, a_file); 

또는

는 인수의 나머지 부분을 결정하기 때문에 즉, 당신이 flag이 먼저 들어가도록 재구성해야 할 것이다 의미
func(2, 17, 4711); 

이 과정은 컴파일러가 함수에서 제공하는 값과 일치하도록 더 이상 도움을받지 못하기 때문에 많은주의를 요합니다. cts.

내가 적절한 인수 공통 "노동자"함수를 호출하는 대신 다른 최상위 기능으로 구조 조정 추천 :

func_mode1(42, a_file); 
func_mode2(17, 4711); 

이 다음에 작성, 적절한 flagfunc()을 부를 수를 적용되지 않는 인수 (예 : 사용되지 않은 파일 포인터의 경우 NULL)에 적합한 기본값.

+0

오 감사합니다! 이것은 흥미 롭다 그러나 나는 Ouah가 기술 한 것을 사용하는 것이 더 간단하다고 생각한다. – polslinux

2

처리하려는 각 사례에 대해 별도의 함수를 만듭니다. 이렇게하면 더 읽기 쉬운 코드가됩니다. 코드를 해킹하기보다는 코드를 통해 의도를 진술하십시오. 함수를 호출하고 인수가 사용되지 않을 때

1

코드가 잘 작동하고 한 번 시도해보고 오류가 없는지 확인하십시오. 오류가 발생하지 않아야합니다. func에서 케이스를 flag으로 사용하고 을 switch으로 사용해 볼 수도 있습니다. 코드에서 Nothingothersum을 사용하지 않을 것이라고 확신합니다.

+0

네, 맞아요. 그들은 단지 예일뿐입니다. 그러나 당신의 대답을 주셔서 감사합니다 :) – polslinux