함수 선언은 함수 정의 앞에 있으며 함수의 이름, 반환 형식, 스토리지 클래스 및 기타 특성을 지정합니다. 프로토타입이 되도록 함수 선언은 함수의 인수에 대한 형식 및 식별자도 설정해야 합니다.
문법
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태그는 전역 범위에서 계속 입력됩니다.