문제

설정

C에서 함수를 호출 할 때 기본 인수 프로모션에 대한 몇 가지 질문이 있습니다. 여기 6.5.2.2 절은 "기능이 호출됩니다"단락 6, 7 및 8의 경우입니다. C99 표준 (PDF) (읽기 쉬운 목록에 강조 및 분해) :

단락 6

  1. 호출 함수를 나타내는 표현식에 유형이있는 경우 프로토 타입은 포함되지 않습니다, 정수 프로모션은 각 인수와 유형이있는 인수에 대해 수행됩니다. float 홍보됩니다 double. 이것들은 기본 인수 프로모션.
  2. 인수 수가 매개 변수 수와 같지 않으면 동작이 정의되지 않습니다.
  3. 함수가 유형으로 정의 된 경우 프로토 타입을 포함합니다, 그리고 프로토 타입은 타원으로 끝납니다 (, ...) 또는 프로모션 후 인수의 유형은 매개 변수의 유형과 호환되지 않으며 동작은 정의되지 않습니다.
  4. 함수가 유형으로 정의 된 경우 프로토 타입은 포함되지 않습니다, 프로모션 후 인수의 유형은 홍보 후 매개 변수의 유형과 호환되지 않으며 다음과 같은 경우를 제외하고 동작은 정의되지 않습니다.
    • 하나의 프로모션 유형은 서명 된 정수 유형이고, 다른 프로모션 유형은 해당 부호없는 정수 유형이며, 값은 두 유형으로 표현 될 수 있습니다.
    • 두 유형 모두 문자 유형의 자격이 있거나 자격이없는 버전의 포인터 또는 void.

단락 7

  1. 호출 함수를 나타내는 표현식에 유형이있는 경우 프로토 타입이 포함되어 있습니다, 인수는 할당에 의해 해당 매개 변수의 유형으로 암시 적으로 변환되어 각 매개 변수의 유형을 선언 된 유형의 자격이없는 버전으로 취합니다.
  2. 함수 프로토 타입 선언자의 엘립스 시스 표기법은 마지막 선언 된 매개 변수 이후에 인수 유형 변환이 중지되도록합니다. 기본 인수 프로모션은 후행 인수에 대해 수행됩니다.

단락 8

  1. 다른 전환은 암시 적으로 수행되지 않습니다. 특히 인수의 수와 유형은 기능 정의의 매개 변수의 수와 유형과 비교되지 않습니다. 기능 프로토 타입 선언자는 포함되지 않습니다.

내가 아는데 것을

  • 그만큼 기본 인수 프로모션 ~이다 char 그리고 short 에게 int/unsigned int 그리고 float 에게 double
  • 변수 함수에 대한 선택적 인수 (예 : printf)는 기본 인수 프로모션의 적용을받습니다

기록을 위해, a에 대한 나의 이해 기능 프로토 타입 이것은 :

void func(int a, char b, float c);  // Function prototype
void func(int a, char b, float c) { /* ... */ }  // Function definition

의문

나는이 모든 것을 사로 잡는 데 정말 힘들다. 다음은 몇 가지 질문입니다.

  • 기본 프로모션 및 암시 적 변환과 관련하여 프로토 타입 및 비 프로토 타입 기능의 행동이 실제로 크게 다릅니 까?
  • 기본 인수 프로모션은 언제 발생합니까? 항상입니까? 아니면 특별한 경우 (변수 함수와 같은)입니까? 함수가 프로토 타입인지 여부에 따라 다릅니 까?
도움이 되었습니까?

해결책

upvoted Aprogrammer의 답변 - 실제 상품입니다.

궁금한 분들을 위해 1988 년 이전의 암흑 시대에는 클래식 "K & R"C에는 기능 프로토 타입과 같은 것이 없었으며 (a) 비용이 들지 않기 때문에 (a) 본질적으로 "무료"가 있었기 때문에 기본 인수 프로모션이 설립되었습니다. 레지스터에 단어를 넣는 것보다 바이트를 레지스터에 넣고 (b) 매개 변수 통과의 잠재적 오류를 줄이는 것. 두 번째 이유는 결코 그것을 잘라 내지 않았기 때문에 ANSI C에서 기능 프로토 타입의 도입이 C 언어에서 가장 중요한 단일 변화였습니다.

기본 프로모션이 시작될 때 : 기본 인수 프로모션은 인수의 예상 유형이 정확히 사용됩니다. 알려지지 않은, 프로토 타입이 없거나 논쟁이 다양 할 때입니다.

다른 팁

  • 프로토 타입으로 함수에 대한 (비 변수) 매개 변수는 해당 유형으로 변환되며, 이는 숯, 짧은 플로트 일 수 있습니다.

  • 프로토 타입 및 변수 매개 변수가없는 함수에 대한 매개 변수에는 기본 인수 프로모션이 적용됩니다.

프로토 타입으로 함수를 정의하고 프로토 타입이나 Vise Versa없이 사용하고 유형 Char, Short 또는 Float의 매개 변수가 있으면 런타임에 문제가있을 수 있습니다. 프로모션 된 유형이 인수 목록을 읽을 때 사용되는 내용과 일치하지 않으면 변수 함수와 동일한 종류의 문제가 있습니다.

예 1 : 프로토 타입으로 함수를 정의하고 사용하지 않고 사용할 때 문제.

정의 .C

void f(char c)
{
   printf("%c", c);
}

사용 .c

void f();

int main()
{
   f('x');
}

int가 전달되고 함수가 숯을 기대하기 때문에 실패 할 수 있습니다.

예 2 : 프로토 타입없이 함수를 정의하고 하나와 함께 사용할 때 문제.

정의 .C

void f(c)
   char c;
{
   printf("%c", c);
}

(이것은 일종의 정의입니다. 매우 구식입니다)

사용 .c

void f(char c);

int main()
{
   f('x');
}

int가 예상되지만 숯이 통과되기 때문에 실패 할 수 있습니다.

참고 : 표준 라이브러리의 모든 기능에는 기본 프로모션으로 인한 유형이 있습니다. 따라서 프로토 타입이 추가 될 때 전환 중에 문제가 발생하지 않았습니다.

당신의 혼란은 용어에 대한 매우 약간의 오해에서 비롯됩니다. 선언과 정의는 프로토 타입을 포함 할 수 있습니다.

void func(int a, char b, float c);

그것은 기능입니다 선언 여기에는 프로토 타입이 포함됩니다.

void func(int a, char b, float c) { /* ... */ }

그것은 기능입니다 정의 여기에는 프로토 타입이 포함됩니다.

"프로토 타입"및 "비 프로테로 타입"은 기능의 속성 일뿐입니다. 유형, 그리고 선언과 정의는 모두 함수의 유형을 소개합니다.

따라서 프로토 타입없이 선언을 가질 수 있습니다.

void func();

또는 프로토 타입없이 정의를 가질 수 있습니다 (K & R C 스타일).

void func(a, b, c)
    int a;
    char b;
    float c;
{ /* ... */ }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top