2014-12-28 3 views
0

다른 형식의 인수를받는 함수를 어떻게 정의 할 수 있는지 알고 싶습니다.다른 인수를 가진 함수

예를 들어 인쇄 할 문자열과 첫 번째 문자열의 배경색을 나타내는 정수를 정의하려는 경우 (콘솔에서 색상을 변경하는 데는 문제가 없습니다)

그러나 함수가 첫 번째 문자열 만받는 경우 배경색을 기본값 (예 : 검정색)으로 선택해야합니다.

"main"함수에이 기능이 있기 때문에이 질문에 대한 답을 얻을 수 있다고 생각합니다. 인수 나 argc 및 argv를받을 수 없습니다.

저는 초보자입니다 C 프로그래머입니다.

편집

:

//suppose I have defined colors 
#define first(a,...) (a) 
#define second(a,b,...) (b) 
#define third(a,b,c,...) (c) 
#define myprint(...) (myPrintf(first(__VA_ARGS__,BLACK),second(__VA_ARGS__,GRAY),third(__VA_ARGS__))) 
void myPrintf(int backgroundColor,int textColor,char * string){ 
    int color=16*backgroundColor+textColor; 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color); 
     printf("%s",string); 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x07); 
} 
int main(){ 
    myprint(,,"hello");//error 
} 

하지만 : 나는 void myPrintf(int backgroundColor,int textColor,char * string) 기능이이 코드를 작성하고 내가 같은 결과를 원하는

Frxstrem의 대답 한 후 Frxstrem의이 개 인수 기능에 대한 답변으로 이 오류가 발생합니다 :

error C2059: syntax error : ')' 
+1

가변 기능에 대해 알아보십시오. http : // ko에서 이렇게하기 시작할 수도 있습니다.wikipedia.org/wiki/Variadic_function – alk

+4

함수 오버로딩에 대한 자세한 내용은 http://stackoverflow.com/questions/479207/function-overloading-in-c – kwierman

+2

'메인'에 대해서는 [두 가지 형식이 정의되어 있습니다 ] (http://stackoverflow.com/questions/4207134/what-is-the-proper-declaration-of-main). – usr2564301

답변

4

귀하의 질문은 다음과 같습니다. tually 기본 인수를 제공에 대한, 당신은 가변 인자 매크로를 이용할 수 있습니다 myprint("hello world", 123456)myprint_("hello world", 123456)로 소비됩니다 동안

// always returns first and second argument, respectively 
#define FIRST(a, ...) (a) 
#define SECOND(a, b, ...) (b) 

// define the color black as a constant 
#define BLACK 0x000000 

// our C function 
void myprint_(const char *string, int bgcolor); 

// our C macro 
#define myprint(...) (myprint_(FIRST(__VA_ARGS__), SECOND(__VA_ARGS__, BLACK))) 

지금 myprint("hello world");myprint_("hello world", BLACK)로 확대됩니다.

+0

제가 초급자라고 말했기 때문에 나는 매크로를 아주 자세하게 사용하는 것에 익숙하지 않습니다. – Mohammad

+0

@MK 글쎄, 내가 아는 한 적어도 실제로 C에서 질문에서 물어 본 것을 할 수있는 유일한 방법이다. 그러나 나는 두 개의 다른 이름의 함수를 만들 수있는 대안적인 솔루션으로 추천 할 것이다. myprint'와'myprint_black')를 호출하고,'myprint_black'에서'myprint'를 호출합니다. – Frxstrem

+0

이것은 표준 C가 아니며 gcc 확장 일 가능성이 있습니까? Variadic 매크로가 다르게 작동하면 '...'이 이름을 따르지 않습니다. –

1

Frxstrem의 답변이 정확하고 (그 사람이 내 upvote를 가지고 있지만) 프리 프로세서 매크로를 너무 자유롭게 사용하면 코드 냄새가 난다. 그래서 순수 주의자의 접근은 단지 다른 통해 하나의 두 가지 기능, 간단한 전화를 선언하는 것입니다 :

void myprint_color(char* string, int color) { 
    ... 
} 

void myprint(char* string) { 
    myprint_color(string, kBackgroundColor); 
} 

이 방법은 두 가지 장점이 있습니다

  1. 그것은 무엇을 독자에게 매우 분명하다 사고.

  2. 두 기능의 모든 기능을 하나의 본문에 제공해야하는 것은 아닙니다. I. e.

    void myprint(char* string) { 
        ... 
    } 
    
    void myprint_color(char* string, int color) { 
        int savedColor = /* get current text color */; 
        /* set the text color */ 
    
        myprint(string); 
    
        /* reset the text color to savedColor */ 
    } 
    

    이 방법으로, 간단한 기능은 정말 색상을 설정 피하고, 다른 하나는 정말 관련 코드를 추가하면서, 대신 항상 디폴트 색상을 설정 : 당신은이 같은 다른 방법으로 라운드를 구현하는 무료입니다 검은 색으로.

    기능을 구현하는 것이 더 편리한 방법을 자유롭게 사용할 수 있습니다. 그리고 나중에 사용자 측에서 코드를 깨지 않고 한 구현에서 다른 접근으로 구현을 변경할 수도 있습니다. 기본 인수의 룩앤필을 제공하는 선처리 마술을 제자리에두면 이러한 변경 작업을 수행 할 수 없습니다.

+0

그러나이 답변은 정확하지만 내 질문에 대한 대답이 아닌 것 같습니다. – Mohammad

관련 문제