문제

진정한 표준을 준수해야의 모든 기능에서 C(을 제외한 주요)시제품을 제작하는 경우에도,그들은 단지 사용 후 자신의 정의에서 같은 번역 단위는 무엇입니까?

도움이 되었습니까?

해결책

이에 따라 당신이 무엇을 의미하는 진정한 표준을 준수'.그러나 짧은 대답은"좋은 아이디어도록 모두 함수 프로토 타입을 가지고 있는 범위에서 사용되기 전에".

더 자격을 갖춘 응답는 경우 이 함수 변수를 인수(특히 printf() 가족의 기능),다음은 프로토타입에 있어야 합 범위를 엄격히 기준을 준수합니다.이것은 진정한 의 C89(ANSI)과 C90(ISO;과 같 C89 를 제외하고 섹션에 대해 번호 매기기).다른 것보다'varargs'기능이지만,함수는 반환 int 어야 하지 않을 선언하고 반환하는 함수가 아닌 다른 int 를 필요로 하는 선언을 보여줍니다 반환 입력하지만 필요하지 않은 시제품에 대해 인수 목록입니다.

그러나는 경우 이 함수는 인수를 따라'정상적인 프로모션'의 부재에서 프로토타입을(예를 들어,사용하는 함수 charshort 모으로 변환 int;더 심각하게도,함수 floatdouble음)프로토타입이 필요합니다.표준에 대한 lax 이 허용하는 오래 된 C 코드를 컴파일하에 표준 준수는 컴파일러;나의 코드를 작성하지 않은 걱정 없는 기능을 사용하기 전에 선언-에 의해 정의,노인 코드를 사용하지 않았 프로토타입 이후 그들은하지 않았다에서 사용할 수 있 C 까지 있었 표준입니다.

C99 허용하지 않'암시적 int'...그 의미를 모두 분의 경우 다음과 같'static a;'(는 int 기본값)또는 암시적 기능을 선언할 수 있습니다.이러한 언급(와 함께 약 50 기타 주요 변경)서문에서 ISO/IEC9899:1999, 는 비교하는 표준 이전 버전:

  • 을 제거하는 암시적 int
  • 을 제거하는 암시적 기능을 선언

ISO/IEC9899:1990,§6.3.2.2 호출 기능 밝혔다:

을 경우 식 앞에 있는 내수 목록 함수 호출에서으로 구성됩 전적으로 식별자,그리고지 않은 경우 선언에 표시되는 이 식별자,식별자는 암시적으로 선언된 대로 정확하게하는 경우,가장 안쪽에 있는 블록을 포함하는 함수 호출 선언:

extern int identifier();

나타났다.38

38 는 식별자를 가진 블록 범위로 선언하는 외부 링크와 함께 입력 없이 기능 매개변수 정보를 반환하는 int.면서 사실은 그렇지 않으로 정의하는 데 유형"기능 로 돌아 int은,"동작이 정의되지 않습니다.

이 단락에서 없 1999 표준입니다.나지 않은(아직)추적 변경 내에서는 말할 수 있는 static a; 에 C90 및 허용하지 않는(구 static int a; 에서)C99.

한 경우에는 기능이 정적 정의될 수 있 사용하기 전에,그리고 필요하지 않 앞에는 선언입니다.GCC 할 수 있도록 설득하기 위터는 경우 정적이 아닌 함수 정의를 선언하지 않고 이전 그것은(-Wmissing-prototypes).

다른 팁

A prototype 는 기능이 선언하는 유형을 지정합의 기능을의 매개 변수입니다.

Pre-ANSI C(언어 설명에 의해 1978 년 첫 번째 에디션의 커&Ritchie 의"C 프로그래밍 언어")하지 않았 프로토타입;그것은 가능하지 않았다 함수의 선언을 설명하는 번호 또는 형태의 매개 변수입니다.그것은 호출자에게 전달하는 올바른 숫자와 형식의 인수를 사용합니다.

ANSI C 소개된"프로토 타입",는 선언을 지정 유형의 파라미터(기능을 빌려서는 C++).

로 C89/C90(ANSI 및 ISO 표준을 설명하는 동일한 언어)에는,그것의 법적 함수를 호출이 없는 표시되는 선언;암시적 선언을 제공합니다.는 경우에 암시적 선언와 호환되지 않는 실제 정의에(예를 들어,통화 sqrt("foo"), 후,동작이 정의 되지 않습니다.도 이러한 암시적 선언이나 비 프로토 타입 선언할 수 있습와 호환됩 함수,그래서 모든 호출됩니능(아 printfscanf)가 있어야 합 프로토 타입입니다.

C99 떨어졌다는 암시적 선언이 있습니다.모든 함수를 호출하지 않고 눈에 보이는 선언은 제약 위반,필요한 컴파일러는 진단을 사용합니다.그러나 그 선언문은 여전히 필요하지 않기 프로토타입할 수 있는 스타일을 선언하지 않는 지정 매개변수 유형입니다.

C11 만든 큰 변화 없이 지역에서.

그래서 심지어 같 2011ISO C 표준,이전 스타일의 기능을 선언하고 정의(는"퇴행성"1989 년)은 아직 허용에 따르는 코드입니다.

모든 버전의 C1989 년 스타일의 문제로,거기에 아주 작은 이유로 사용하지 않는 프로토타입에 대한 모든 기능을 사용할 수 있습니다.된 선언 및 정의되지만 침입을 피하기 위해 오래된 코드입니다.

No,기능하지 않은 항상 필요합니다.유일한 요구 사항은 함수는"선"당신이 전에 그것을 사용합니다.는 두 가지 방법이 있을 선언하는 기능:을 쓰기 프로토타입 또는 쓰는 함수 자체(이라고"정의입니다.") 의 정의는 항상 선언,그러나 모든 선언의 정의입니다.

그렇다,모든 기능이 있어야 합 프로토타입이지만,프로토타이핑할 수 있는 별도의 선언으로 또는 부분의 함수의 정의입니다.함수 정의를 서면에서 C89 까지 자연스럽게 프로토타입이지만,만약 당신이 쓰는 일들에 고전적인 K&R 스타일로,따라서:

main (argc, argv)

  int argc;
  char **argv;

{
  ...
}

다음의 함수 정의가 없 프로토 타입입니다.당신이 쓰는 경우에는 ANSI C(C89)스타일로,따라서:

main (int argc, char **argv) { ... }

그런 다음 기능을 정의 프로토 타입입니다.

좋은 팁을 작성할 때 새로운 기능을 쓰는 것입니다 그들이 거꾸로 주요 바닥에서 변경할 때 당신의 마음에 대한 함수의 인자 또는 반환되지 않는 유형을 수정해야 시제품을 너무입니다.지속적으로 고정 시제품을 취급하고 있으며 모든 컴파일러의 경우 그들은 날짜에 정해져 있다.

일단 당신이 당신의 기능을 원활하게 작업이 함께 이동하는 코드를 잘 이라는 모듈을 넣어 프로토타입을 지지 않습니다.h 파일의 동일한 이름입니다.저장 심각한다.가장 큰 생산성 원조에서 찾은 5 년입니다.

의 지식(ANSI C89/ISO C90),no.나는에 대해 잘 모르 C99;그러나 내가 기대하는 것이 동일합니다.

개인 노트: 를 함수 프로토 타입니다.

  1. 요(을 때()호출(B) (B)통화())또는
  2. 나는 내보내기 기능그렇지 않으면,그것은 느낌이 필요하지 않습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top