2016-08-17 3 views
0

OS 과정을 배우고 있습니다. 우리는 파이프를 가르쳤고이 프로그램은 GCC 4.4.7에서 컴파일되지 않습니다. mainint main으로 변경하면 정상적으로 컴파일됩니다. 그 이유는 무엇입니까?이 파이프 프로그램이 컴파일되지 않습니다.

명령 행 : gcc pipedemo.c

#include<stdio.h> 
#include<sys/types.h> 
#include<string.h> 
#include<unistd.h> 
#include<stdlib.h> 

#define BUFFER_SIZE 100 
#define READ_END 0 
#define WRITE_END 1 

main() 
{ 
     char source[]="pipe_program"; 
     char dest[BUFFER_SIZE]; 
     char datas[BUFFER_SIZE]; 
     char datar[BUFFER_SIZE]; 
     int fd1[2],fd2[2]; 
     pid_t pid; 
     if(pipe(fd1)==-1) 
     { 
       fprintf(stderr,"Pipe creation failed\n"); 
       exit(0); 
     } 

     if(pipe(fd2)==-1) 
     { 
      //... 
     } 
     //... 
} 
+0

귀하 또는 귀하의 친구가 비표준 함수 정의 구문을 사용하려는 이유가 있습니까? – MikeCAT

+0

이유는'-Werror' 옵션 또는 그럴 수 있습니다. 명령 줄 옵션을 공개 하시겠습니까? – MikeCAT

+0

@MikeCAT 나는 이유가 없지만 기본적으로 리턴 타입은 int이므로 우리가 썼다. 그러나 나는 무엇이 오류인지 알기를 원합니다. 편집에서 intrested가 아닙니다. –

답변

2

이 표준 (ISO/IEC 9899-2011)은 약 main 말한다 :

5.1.2.2.1 프로그램 시작

에서 호출되는 함수를 프로그램 시작 이름은 main입니다. 구현 은이 기능에 대해 프로토 타입을 선언하지 않습니다. 이것은 INT 리턴 유형없고 파라미터로 정의한다 :

 int main(void) { /* ... */ } 

또는 어떤 이름이있을 수 있지만,는 argc 및 argv를 여기에 언급 된 두 개의 매개 변수 (함께 사용, 그들은에 국부적으로 그들이 선언 된 기능) :

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

또는 이와 동등한 것;

그럼 어떻게 끝나나요?
아니요 쉽지 않습니다. 따옴표의 끝에는 작은 세미콜론이 있고 그 뒤에 오는 것은 약간 작고 겉으로는 결백 한 부분입니다.

또는 다른 구현 방식으로 정의 된 방식입니다. 섹션 5.1.2.1에서 (AN OS 및 규칙 내의 섹션 5.1.2.2)와 "프리 스탠딩"를 ("호스팅". 예를 들어 작은 PIC 또는 유사한, 거의 모든 규칙의 차이가보다

) 모두에 그리고 나머지 구현 정의되는 함수 정의 문법은 아이템 판독 섹션 6.9.1에 정의 된 1

이름이다 (함수 정의에서 선언 된 식별자)는 함수 정의의 선언자 부분에 지정된 함수 유형을 가져야합니다.

는 또한 항목 2

함수의 리턴 타입이 무효 또는 어레이 형 이외의 완전한 객체 유형에 자세히.

모든 함수 정의 (main 포함)에는 반환 유형을 지정해야합니다.

위의 "독립 환경"에 대한 규칙을 참조하십시오.

+0

자세한 내용은 [main()이 C 및 C++에서 반환해야하는 사항] (http://stackoverflow.com/questions/204476/)을 참조하십시오. –

관련 문제