2012-04-27 8 views
5

나는 매크로에 대한 몇 가지 코드를 찾고 있었다, 나는 매크로«의 va_start를보기»에 대한이 같은 코드를 발견왜 stdarg.h 매크로가«__va_size»입니까?

#define __va_argsiz(t) \ 
    (((sizeof(t) + sizeof(int) - 1)/sizeof(int)) * sizeof(int)) 
#define va_start(ap, pN) \ 
    ((ap) = ((va_list) (&pN) + __va_argsiz(pN))) 

내가«__va_argsiz»기능의 목적이 정확히 무엇인지 알고 싶습니다. 그것은 정렬 제한입니까?

감사합니다.

+1

귀하가이 플랫폼을 발견 한 플랫폼에 대한 세부 정보를 제공하지 않으면 질문에 의미가 없습니다. –

답변

4

정렬, 첫 번째 인수의 크기에 따라, 변수 인수 목록의 시작을 계산하는 데 사용됩니다처럼 보이는 C.

3

의 기본 유형 승격 규칙 둘. 첫 번째 인수는 필수 일반 인수입니다. 즉, printf()의 경우 형식 문자열에 대한 포인터가됩니다.

1

variable length arguments에 사용됩니다. 예를 들어 printf은 가변 길이 인수 목록을 사용합니다. __va_argsiz은 목록의 크기를 계산하고 va_start은 시작을 결정합니다.

1

"제한"없음, 구현. __va_argsizt의 경우 sizeof(int)의 배수로sizeof(t) 인 경우 반올림합니다. 이것은 varargs 함수 호출 프로토콜의 일부로 호출 스택에서 전달되는 uknown 인수가 자동으로 배열되고 sizeof(int) (플랫폼에 따라 다름)의 배수로 할당되고 거기에서 올바르게 검색되어야하기 때문에 필요합니다.

도 참조하십시오. http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/

관련 문제