나는 va_start(), va_arg() 매크로 뒤에 무엇이 있는지 알아 내려고하고있다. 아래의 코드는 잘 작동합니다. 나는이 같은 출력 준 예상대로c 가변 함수 혼동
#include <iostream>
#include <cstdarg>
void f(double a, double b, ...)
{
va_list arg;
va_start(arg, b);
double d;
while((d = va_arg(arg, double)) != 0)
{
std::cout << d << '\n';
}
}
int main(int argc, char *argv[])
{
f(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 0.0);
return 0;
}
: 3 4 5 6 7 8 9 그럼 내가 인터넷에 내 헤더와 stdarg.h이 신비의 원인 (즉 macroses의 정의를 발견 -이 매크로를 정의를 va_arg를 (v, l)처럼 _builtin_va_arg (v, l), 마지막에 정의되어 있지 않고 stdarg.h는 아무것도 포함하지 않으므로 일부 라이브러리 ???)에 있습니다. 그럼에도 불구하고, "cstdarg"대신에 내가 쓴 :
typedef char* va_list;
#define _INTSIZEOF(n) \
((sizeof(n)+sizeof(int)-1) &~(sizeof(int)-1))
#define va_start(ap,v) \
(ap = (va_list)&v + _INTSIZEOF(v))
#define va_arg(ap,t) \
(*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
#define va_end(ap) (ap = (va_list)0)
출력은 1 -0.0409377 -0.0409377 4.88084e-270 4.85706e-270 4로, 이상한되었다 9. 가변 매개 변수는 마지막으로 선언 된 매개 변수 옆에 배치되지만 분명히 더 복잡한 상황이 있다고 생각했습니다. 누군가 내가 잘못되었거나 실제로 일어난 일을 공개한다면 나는 매우 기뻐할 것입니다.
전에는 언급하지 않았지만 필기체 매크로는 int 형식으로 잘 작동합니다. 즉, 모든 매개 변수가 마지막으로 정의 된 인수에 상대적으로 예상대로 배치됩니다. 더블 타입 매개 변수의 경우에도 스택에 있지만 이상한 방식으로, 즉 올바른 결과를 얻을 수있는 마지막 여섯 번째 포인터를 포인터에 처음 6 추가. 어떤 종류의 패딩입니까? 더 이상, 나는 정의 된 주장이 두 번 있다는 것을 발견했다.첫 번째 인수에 시작 포인터를 놓는 것을 볼 수 있습니다. 여러분은 그것들을 얻습니다. 그리고 네 가지 물건 번호와 다시 한번 모든 매개 변수를 하나씩 얻습니다. – Nephew
나는 그것이 그것을 알기에는 너무 멀리 떨어져 있지만 여전히 호기심이 있다는 것을 이해합니다. 감사. – Nephew