2010-08-13 3 views
2

printf()와 같은 함수는 매개 변수의 수를 제한하지 않는다는 것을 알게되었습니다.매개 변수의 수를 제한하지 않는 함수에서 매개 변수를 전달하는 방법은 무엇입니까?

그러나 솔라리스에서 프로그램을 디버깅 할 때 5 개 이상의 매개 변수를 스택에 넣는 것으로 나타났습니다. 5 개 이상의 매개 변수가 있으면 공통 레지스터가 사용됩니다.

공용 레지스터가 printf와 같은 함수로 충분하지 않다면 어떻게 될까요? 컴파일러가 나를 위해 뭔가를 했나요?

답변

4

동작은 플랫폼의 ABI에서 제어합니다. 레지스터에 적합하지 않은 매개 변수가 더 많으면 다른 방식으로 처리됩니다. 전달할 수있는 인수의 수에는 간단한 상한이 없으므로 컴파일러와 ABI는 해당 하드웨어에서 작동하는 메커니즘을 정의합니다. SPARC에서 작동하는 것은 Intel IA32와 같이 반드시 작동하지는 않습니다.

0

일반적으로 ABI가 인수 전달 용 레지스터를 사용하는 플랫폼은 가변 인수 함수에 대한 다른 호출 규칙으로 전환하여 모든 것이 스택에 전달됩니다. C 표준이이라는 프로토 타입없이 가변 인수 함수를 호출하는 정의되지 않은 동작 을 할당 한 이유입니다. 프로토 타입이 없으면 컴파일러에서 잘못된 호출을 생성합니다.

일부 플랫폼은 일종의 연결 목록을 구성하고 해당 목록에 숨겨진 포인터를 전달하는 등 다양한 인수를 가변 함수에 전달하는 더 복잡한 (쓸데없이 복잡하기 만합니다.) 방법을 사용한다는 점에 유의해야합니다. 그러면 va_start이 어떻게 든 얻을 수 있습니다. 프로그래머로서, 당신은 단지 stdarg.h을 예상되는 것을 수행하는 블랙 박스로 취급해야하고 더러운 구현의 일부분을 절대 볼 필요가 없도록기도해야합니다.

관련 문제