2013-06-28 4 views
1

C 언어의 경우 컴파일러는 기본 인수 승격을 호출합니다. 호출 된 함수에 프로토 타입이없는 경우입니다.언제 기본 인수 프로모션이 발생합니까?

하지만 C++은 어떻습니까? 기본 인수 프로모션은 언제 발생합니까? 에서는

C++ 11 표준 5.2.2/7

주어진 인수에 대한 파라미터는 없다

는 인수 수신 함수 값을 얻을 수있는 방식으로 전달 이다 va_arg (18.10)를 호출하여 인수의 [참고 :이 단락 은 함수 매개 변수 팩에 전달 된 인수에는 적용되지 않습니다. 함수 매개 변수 팩은 템플릿 인스턴스화 중 (14.5.3) 동안 확장되므로 함수 템플릿 전문화가 실제로 호출 될 때 각 인수에는 해당 매개 변수가 있습니다. -end note] 인수 식에서 행간 대 값 (4.1), 배열 대 포인터 (4.2) 및 함수 - 포인터 (4.3) 표준 변환이 수행됩니다. std :: nullptr_t 형식 (가능하면 cv 한정)의 형식은 void * (4.10) 형식으로 변환됩니다. 이 변환 후에 인수에 산술, 열거 형, 포인터, 멤버에 대한 포인터 또는 클래스 형식이 없으면 프로그램이 잘못 구성됩니다. 잠재적으로 평가 된 클래스 유형의 인수 (9 절) 중요하지 않은 복사 생성자, 간단한 이동 생성자 또는 중요하지 않은 소멸자가 해당 매개 변수없이 전달되면 은 구현 정의에서 조건부 지원 됨 의미론. 인수가 정수 승격 (4.5) 또는 부동 소수점 승격 (4.6) 인 의 영향을받는 부동 소수점 형식의 정수 또는 열거 형을 갖는 경우 인수의 값은 이 승격 된 전화하기 전에 입력하십시오. 이 프로모션은 기본 인수 프로모션이라고하는 입니다.

이 단락은 기본 인수 승격이 언제 발생하는지 아직 지정하지 않습니다. 이 단락은 명확한 논리없이 너무 많이 말할 수 있습니다. 나는 논리를 개괄하려고 노력했지만 실패했다. va_arg을 호출하는 에 익숙하지 않습니다.

나를 도와주세요.

답변

1

기본 프로모션은 호출 컨텍스트에서 함수가 호출되기 전에 발생합니다.

기본 프로모션이 수행되는 상황에 대해 정말로 묻는다면, 그 내용은 발췌 부분에서 다루어 지지만 놓칠 수 없을 정도로 작은 조각이라 할지라도 : "주어진 인수에 대한 매개 변수가 없을 때. .. ". 다시 말해서, C의 상황과 본질적으로 동일합니다. 단, 매개 변수 유형을 지정하지 않는 C 스타일의 함수 선언은 C++에 존재하지 않습니다. 따라서 유형을 지정하는 매개 변수없이 인수를 가질 수있는 유일한 시간은 함수에 명시적인 줄임표가있는 경우입니다 (예 : printf : int printf(char const *format, ...);).

1

매우 단락에서 질문에 인용 : "인수 값은 통화하기 전에 수준 올리기 유형으로 변환됩니다".

호출 된 함수가 프로토 타입을 가지고 있지 않을 때 C "기본 인수 승격"이라고 말하지만 시나리오가 C++에 존재하지 않는다는 것을 기억하십시오. 선언이나 정의가없는 함수를 호출 할 수 없습니다.

"va_arg 호출"에 대한 언급은 va_arg 함수 (http://linux.die.net/man/3/va_arg 참조)를 사용하여 값에 액세스 할 함수를 호출 할 때 인수 승격 중 일부가 적용됨을 의미합니다. 하나의 함수 호출은 값 int(3), 또 다른 int(7777), 또 다른 char(7)을 전달할 수 있습니다. 호출 된 함수는 무엇을 기대해야하는지 어떻게 알 수 있습니까? 이 매개 변수의 모든 값을 int 또는 long과 같이 지원되는 정수로 올리면 함수 내에서 va_arg이 사용되면 int 또는 long에서 va_arg 호출로 지정되는 형식으로 변환됩니다. 예를 들어, char이 예상되는 곳에서 int(7777) 값이 전달 될 수 있으며 경고없이 8 비트로 잘릴 수 있지만 일반적으로 프로그램에서 충돌하는 것보다 나은 것은 전달 된 데이터의 바이트 수가 ' 소비 된 숫자와 일치하거나 다른 이상한 부작용.

관련 문제