C 언어 에서 가 변 매개 변수의 사용 방법 예시

머리말
C 언어 프로그램 작성 에서 우리 가 가장 많이 사용 하 는 함 수 는 printf 와 유사 한 변형 체 를 포함 합 니 다.이 함 수 는 C 라 이브 러 리 함수 에 포함 되 어 있 으 며 int printf(const char*format,...)로 정의 합 니 다.
포맷 문자열 외 에 도 여러 개의 가 변 파 라 메 트릭 을 입력 할 수 있 습 니 다.예 를 들 어:

   printf("%d",i);
   printf("%s",s);
   printf("the number is %d ,string is:%s", i, s);

포맷 문자열 의 판단 은 이 장 에서 잠시 논 하지 않 고 가 변 매개 변수의 실현 세부 사항 을 분석 합 니 다.
간단 한 실례

int simple(int num,...)
{
  int i, result=0;
  va_list vl;  //va_list  ,  va_start     , char*
  va_start(vl,num);  //              
  printf("num:%d, vl:%d
",num,*vl); for (i = 0; i < (num-1); i++)// num { result = va_arg(vl, int);// vl 4 (sizeof(int) ) , ( ) printf("in for result:%d, *vl:%d
", result, *vl);// , ,vl result } va_end(vl);// return result; } int main(int argc, char **argv) { int num = argc; int i = 0; simple(5,1,2,3,4,5); return 1; }
실행 결 과 는 다음 과 같 습 니 다.
book@book-desktop:~/own$ ./varlist
num:5, vl:1
in for result:1, *vl:2
in for result:2, *vl:3
in for result:3, *vl:4
in for result:4, *vl:5
관련 API 소개
가 변 매개 변수 목록 의 실현 은 몇 개의 매크로 로 구성 되 어 있 으 며,파일 include/stdarg.h 에서:
va_list  특정한 변 수 를 정의 합 니 다.커 널 의 정의:

  typedef char *va_list;//       
va_start(ap, type)   가 변 매개 변수 목록 의 첫 번 째 매개 변수(...안의 첫 번 째)를 가 져 오기 시작 합 니 다.즉,첫 번 째 매개 변수(즉 num)를 건 너 뛰 는 것 입 니 다.

#ifndef __sparc__
#define va_start(AP, LASTARG)             \
 (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))//ap       ,lastarg  
#else
#define va_start(AP, LASTARG)             \
 (__builtin_saveregs (),            \
 AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) //        ,           
#endif

// type      int   4,    int  4   
#define __va_rounded_size(TYPE) \
 (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
va_arg(args, int)  가 변 매개 변수 목록 의 매개 변 수 를 순환 적 으로 가 져 옵 니 다.args 는 다음 매개 변수 주 소 를 가리 키 고 현재 매개 변수 주 소 를 되 돌려 줍 니 다.

// first=va_arg(args,int)
#define va_arg(AP, TYPE)            \//ap          
 (AP += __va_rounded_size (TYPE),          \//  ap - sizeof(type)  ,      
 *((TYPE *) (AP - __va_rounded_size (TYPE))))

// type      int   4,    int  4   
#define __va_rounded_size(TYPE) \
 (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
마지막 바end(ap)종료 플래그 는 프로그램 에서 가 변 매개 변수 목록 의 끝 표지 일 수 있 습 니 다.
3.가 변 참사 응용 은 주의사항
왜냐하면 바start, va_arg, va_end 등 은 매크로 로 정의 되 어 있 기 때문에 어 리 석 어 보 입 니 다.가 변 적 인 매개 변수의 유형 과 개 수 는 이 함수 에서 프로그램 코드 에 의 해 제어 되 고 서로 다른 매개 변수의 개수 와 유형 을 스마트 하 게 식별 할 수 없습니다.그러면 printf 에서 스마트 식별 파 라 메 터 를 실현 하지 않 았 습 니까?함수 printf 는 고정 매개 변수 format 문자열 에서 매개 변수의 유형 을 분석 하고 va 를 호출 하기 때 문 입 니 다.arg 는 가 변 적 인 파 라 메 터 를 가 져 옵 니 다.즉,스마트 인식 가 변 적 인 파 라 메 터 를 실현 하려 면 자신의 프로그램 에서 판단 을 통 해 이 루어 져 야 합 니 다.또 하나의 문제 가 있 습 니 다.컴 파일 러 가 가 변 적 인 매개 변수 함수 의 원형 검사 가 엄격 하지 않 고 프로 그래 밍 에 대한 오류 가 있 기 때 문 입 니 다.
simple 가 변 매개 변 수 를 char 형 포인터 로 만 들 면 빈 포인터 가 존재 하면 coredump 가 발생 합 니 다.

void simple(int i, ...) 
{ 
  va_list arg_ptr; 
  char *s=NULL; 

  va_start(arg_ptr, i); 
  s=va_arg(arg_ptr, char*); 
  va_end(arg_ptr); 
  printf("%d %s
", i, s);    return;  }
가 변 매개 변 수 는 char*형 입 니 다.이 함 수 를 두 개의 매개 변수 로 호출 하 는 것 을 잊 어 버 리 면 core dump(Unix)나 페이지 의 불법 오류(window 플랫폼)가 발생 합 니 다.그러나 오류 가 발생 하지 않 을 수도 있 습 니 다.그러나 오 류 는 발견 하기 어렵 고 질 좋 은 프로그램 을 만 드 는 데 불리 합 니 다.
총결산
C 언어 에서 가 변 적 인 매개 변 수 를 사용 하 는 방법 에 대한 예제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 C 언어 가 변 적 인 매개 변수 용법 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기