C 언어 옵션 인수(C 언어 핵심 기술에서 발췌)

13032 단어 C 언어
C 언어는 variadic 함수라고 불리는 변수 수량의 변수를 정의할 수 있습니다.이러한 함수는 고정된 수의 강제적 자변량(mandatory argument)을 필요로 하고, 그 다음은 수량이 변할 수 있는 선택적 자변량이다.이런 함수는 반드시 '최소한 하나' 의 강제 변수가 있어야 한다.선택적 인수의 유형이 변경될 수 있습니다. 선택적 인수의 수량은 "강제적 인수의 값"에 의해 결정되거나 "선택적 인수 목록을 정의하는 데 사용되는 특수 값"에 의해 결정될 수 있습니다.
C 언어에서 가장 유명한 variadi 함수 예는 printf () 와scanf () 이다.이 두 함수는 모두 강제적인 자변수, 즉 형식 문자열을 가지고 있다.포맷 문자열의 변환 수식자는 선택할 수 있는 변수의 종류와 수량을 결정합니다.
모든 강제적인 변수에 대해 말하자면, 함수 헤더는 일반적인 함수 성명과 같이 적당한 매개 변수를 표시할 것이다.매개 변수 목록의 규격은 강제적인 매개 변수가 앞(쉼표로 구분), 뒤에 쉼표와 생략 기호(...)를 따르는 것이다.이 생략 기호는 선택할 수 있는 자변수를 대표한다.
variadic 함수에서 선택적 인수를 액세스하려면 va 형식을 통과해야 합니다list의 대상, 변수 정보를 포함합니다.이런 유형의 대상도'자변수 포인터'(argument pointer)라고도 하는데 이 창고에 최소한 하나의 자변수의 위치를 포함한다.이 변수 포인터를 사용하여 다음 선택 가능한 변수로 이동할 수 있습니다. 그러면 함수는 모든 선택 가능한 변수를 저장할 수 있습니다.va_list 형식이 stdarg에 정의되었습니다.h 헤더 파일에서.
'수량 가변 변수' 를 지원하는 함수를 작성할 때va 를 사용해야 합니다list 형식은 선택할 수 있는 변수를 저장하기 위해 변수 포인터를 정의합니다.다음 토론에서valist 대상은argptr로 명명됩니다.이 자변수 포인터를 네 개의 매크로로 처리할 수 있습니다. 이 매크로들은 stdarg에 정의되어 있습니다.h 헤더 파일:
void va_start(va_list argptr, lastparam);
va_start 매크로는 첫 번째 선택할 수 있는 변수 위치를 사용하여argptr 변수 포인터를 초기화합니다.이 매크로의 두 번째 인수는 "이 함수에 이름이 있는 마지막 매개변수"의 이름이어야 합니다.선택적 인수를 사용하기 전에 이 매크로를 호출해야 합니다.
type va_arg(va_list argptr, type);
va_Arg 매크로는 현재argptr에서 인용하는 선택할 수 있는 변수를 가져오고, Argptr를 다음 변수로 옮깁니다.va_arg 매크로의 두 번째 인수는 방금 읽은 인수의 유형입니다.
void va_end(va_list argptr);
자변수 포인터가 더 이상 필요하지 않을 때va 를 호출해야 합니다end 매크로.다소vastart 또는 vacopy 이전에 사용했던 변수 포인터를 다시 초기화하려면 v 를 먼저 호출해야 합니다end.
void va_copy(valist dest, va_list src);
va_copy 매크로는 현재 src를 사용하여 변수 포인터dest를 초기화합니다.그리고 src에서 인용한 위치에서부터 선택할 수 있는 변수 목록을 dest로 저장할 수 있습니다.

  
    
1 #include < stdio.h >
2 #include < stdlib.h >
3 #include < stdarg.h >
4
5   void myprintf( const char * fmt, ...)
6 {
7 /*
8 * va_list , .
9 * va_start .
10 * va_arg , .
11 */
12 va_list ap;
13 va_start(ap, fmt);
14 const char * p;
15 for ( p = fmt; * p; p ++ ) {
16 if ( * p == ' % ' ) {
17 switch ( *++ p) {
18 case ' d ' :
19 printf( " %d " , va_arg(ap, int ));
20 break ;
21 case ' f ' :
22 printf( " %f " , va_arg(ap, double ));
23 break ;
24 case ' s ' :
25 printf( " %s " , va_arg(ap, char * ));
26 break ;
27 default :
28 break ;
29 }
30 } else {
31 putchar( * p);
32 }
33 }
34 va_end(ap);
35 }
36   int main( int argc, char * argv[])
37 {
38 myprintf( " %s = %d / %f\ = %f
" , " 100 / pi " , 100 , 3.1415926 , 100 / 3.1415926 );
39 getch();
40 return 0 ;
41 }

결과는 다음과 같습니다. 콘솔에서 출력합니다.
100/pi = 100/3.141593 = 31.830989

좋은 웹페이지 즐겨찾기