2016-08-17 7 views
0

Я изучаю курс ОС. Нам обучали трубы, и эта программа не компилируется в GCC 4.4.7. Когда мы меняем main на int 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, поэтому мы написали это. Но я хочу знать, что такое ошибка, Не интересуется компиляцией –

ответ

2

стандарт (ISO/IEC 9899-2011) говорит о main:

5.1.2.2.1 запуска программы

Функция вызывается в запуск программы называется main. Реализация не объявляет прототип для этой функции. Она должна быть определена с типом возвращаемого междунар и без каких-либо параметров:

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

или с двумя параметрами (именуемых здесь как ARGC и ARGV, хотя любые имена могут быть использованы , так как они являются локальными в функция, в которой они заявлены):

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

или его эквивалент;

Это значит, что все это заканчивается?
Нет, не так просто. В конце цитаты стоит небольшая точка с запятой, и вот что представляет собой эта маленькая, казалось бы, невиновная часть

или каким-либо другим способом реализации.

чем есть разница между «прошел» (раздел 5.1.2.2 в пределах операционной системы и ее правил) и «Свободностоящих» (в разделе 5.1.2.1. Например, на небольшой ПОС или аналогичных, едва каких-либо правил на всех, и остальное определяется реализация)

синтаксис определения функции определен в разделе 6.9.1, где он читает в пункте 1

идентификатор, объявленный в определении функции (которое является именем функции) должен иметь тип функции, как определено частью декларатора определения функции.

Далее подробно описано в пункте 2

Тип возврата функции считается недействительным или полного типа объекта, отличного типа массива.

Поэтому любое определение функции (включая main) должно иметь заданный тип возврата.

Но см. Правила для «автономной среды» выше или лучше, их отсутствие.

+0

Полный просмотр см. В разделе [Что должно быть 'main()' return in C и C++?] (Http://stackoverflow.com/questions/204476/) –

Смежные вопросы