함수 프로토타입

함수 선언은 함수 정의 앞에 있으며 함수의 이름, 반환 형식, 스토리지 클래스 및 기타 특성을 지정합니다. 프로토타입이 되도록 함수 선언은 함수의 인수에 대한 형식 및 식별자도 설정해야 합니다.

문법

declaration:
declaration-specifiers attribute-seq 선택init-declarator-list선택;

/* attribute-seq opt 는 Microsoft 전용 */입니다.

declaration-specifiers:
storage-class-specifier declaration-specifiers 선택
type-specifier declaration-specifiers 선택
type-qualifier declaration-specifiers 선택

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer

declarator:
pointer 선택direct-declarator

direct-declarator: /* 함수 선언자 */
direct-declarator ( parameter-type-list ) /* 새 스타일 선언자 */
direct-declarator ( identifier-list 선택) /* 사용되지 않는 스타일 선언자 */

프로토타입은 닫는 괄호 바로 다음에 세미콜론에 의해 종료되므로 본문이 없다는 점을 제외하고 함수 정의와 동일한 형식을 가집니다. 두 경우 모두 반환 형식은 함수 정의에 지정된 반환 형식에 동의해야 합니다.

함수 프로토타입에는 다음과 같은 중요한 용도가 있습니다.

  • 형식을 반환하는 함수에 대해 반환 형식 int을 설정합니다. 값을 반환 int 하는 함수에는 프로토타입이 필요하지 않지만 프로토타입을 사용하는 것이 좋습니다.

  • 완전한 프로토타입이 없으면 표준 변환이 수행되지만 매개 변수 수를 사용하여 인수의 형식 또는 수를 확인하려고 시도하지 않습니다.

  • 프로토타입은 함수가 정의되기 전에 함수에 대한 포인터를 초기화하는 데 사용됩니다.

  • 매개 변수 목록은 함수 호출의 인수가 함수 정의의 매개 변수와 일치하는지 확인하는 데 사용됩니다.

각 매개 변수의 변환된 형식은 함수가 스택에 배치하는 인수의 해석을 결정합니다. 인수와 매개 변수 간의 형식 불일치로 인해 스택의 인수가 잘못 해석될 수 있습니다. 예를 들어 16비트 컴퓨터에서 16비트 포인터가 인수로 전달된 다음 매개 변수로 long 선언되면 스택의 처음 32비트가 매개 변수로 long 해석됩니다. 이 오류는 매개 변수뿐만 long 아니라 모든 후속 매개 변수에 문제가 발생합니다. 모든 함수에 대해 완전한 함수 프로토타입을 선언하여 이러한 종류의 오류를 감지할 수 있습니다.

프로토타입은 함수의 특성을 설정합니다. 그런 다음 함수 정의 앞에 오는 함수 호출(또는 다른 소스 파일에서 발생)에서 인수 형식 및 반환 형식 불일치를 확인할 수 있습니다. 예를 들어 프로토타입에서 static 스토리지 클래스 지정자를 지정하는 경우 함수 정의에 스토리지 클래스도 지정 static 해야 합니다.

전체 매개 변수 선언(int a)은 동일한 선언에서 추상 선언자(int)와 혼합할 수 있습니다. 예를 들어 다음 선언은 적법합니다.

int add( int a, int );

프로토타입에는 인수로 전달되는 각 식의 형식과 식별자가 모두 포함될 수 있습니다. 그러나 이러한 식별자는 선언이 끝날 때까지만 범위에 있습니다. 프로토타입은 인수 수가 가변적이거나 인수가 전달되지 않는다는 사실을 반영할 수도 있습니다. 이러한 목록이 없으면 불일치가 표시되지 않을 수 있으므로 컴파일러는 관련 진단 메시지를 생성할 수 없습니다. 형식 검사에 대한 자세한 내용은 인수를 참조 하세요.

이제 Microsoft C 컴파일러의 프로토타입 범위는 컴파일러 옵션을 사용하여 컴파일할 때 ANSI를 준수합니다 /Za . 프로토타입 내에서 태그 또는 union 태그를 struct 선언하는 경우 태그는 전역 범위가 아닌 해당 범위에 입력됩니다. 예를 들어 ANSI 규칙으로 컴파일할 /Za 때 형식 불일치 오류가 발생하지 않고는 이 함수를 호출할 수 없습니다.

void func1( struct S * );

코드를 수정하려면 함수 프로토타입 전에 전역 범위를 정의하거나 union 선언 struct 합니다.

struct S;
void func1( struct S * );

아래에서 /Ze태그는 전역 범위에서 계속 입력됩니다.

참고하십시오

함수