2011-03-11 1 views
1

아래 예제를 컴파일하려고하면 경고 메시지가 나타납니다.exit() 함수는 stdlib.h 외에도 선언되어 있습니까?

>gcc -o file file.c 
file.c: In function ‘main’: 
file.c:12: warning: incompatible implicit declaration of built-in function ‘exit’ 

일부 검색을 한 후에 #include <stdlib.h> 명령문이 누락되었습니다. 어디 exit() 함수를 선언했다? stdio.h 라이브러리는이를 선언하지 않습니다. 내 코드도 마찬가지입니다. 컴파일러가 지원한다면 왜 경고를주게됩니까? 또한 stdlib.h에서 왜 재정의됩니까?

예 :

#include <stdio.h> 

int main() 
{ 
    char *fn = "./test.txt"; 
    FILE *fp; 

    if((fp = fopen(fn, "w"))==NULL) 
    { 
     printf("Cannot open file '%s' for writing.\n", fn); 
     exit(1); 
    } 

    fprintf(fp, "Hello, world!\n"); 

    if(fclose(fp)==0) 
     printf("File '%s' closed successfully.\n", fn); 
    else 
     printf("Error closing file '%s'.\n", fn); 

    return 0;  
} 
+0

존재하지 않는 함수를 참조 할 때 동작이 정의되지 않았다고 생각합니다. –

답변

11

GCC는 당신이 그들을 포함하지 않아도 표준 헤더의 내용에 대해 알고 있으며, 함수의 암시 (또는 추정) 선언이 충분히 동일하지 않을 때 불평 헤더가 포함되어 있다면 어떻게 될 것인가.

추론으로 exit()의 유형은 다음과 같습니다

extern int exit(); // Indeterminate argument list 

이 공식 선언과 동일하지 않습니다 : 따라서

extern void exit(int); 

경고. 그것에 익숙해; 코드를 수정하십시오.


[족제비 단어를이 코드는 exit()의 선언이 주석되지 않은 경우 경고없이 컴파일하지만 누락 된 경고를 생성하기 때문에 '충분히'이있다. 족제비 단어의

extern void exit(); 
int main(int argc, char **argv) 
{ 
    if (argc > 1 && argv[0] != 0) 
     exit(1); 
    return(0); 
} 

종료]


참고 :. 사전 표준 C 무겁게 암시 적 함수 선언을 사용했다. C89는 적절한 정의의 사용을 장려하기 시작했습니다. 부분적으로는 모든 표준 함수에이를 선언 한 헤더가 있음을 보장합니다. (POSIX는 헤더에 정의 된 모든 함수가 헤더에 선언되어 있는지 확인함으로써 도움을주었습니다.) C99는 함수에 대한 사전 표준 및 C89 '암시 적 int'해석이 더 이상 유효하지 않다는 말로 한 걸음 나아갔습니다. GCC는 이제 함수를 식별하여 코드를 수정하는 데 도움을줍니다. 당신은 옵션을 사용할 수 있습니다

-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition 

당신이 현대 C 코딩 표준에 정밀 검사되지 않은 낡은 코드베이스 작업 (나 같은) 경우이 문제를 잡을 수 있도록.

+0

그러한 광범위한 답변에 감사드립니다. – artdanil