我正在学习OS课程。
我们被教过管道,这个程序没有在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 :(得分:2)
标准(ISO / IEC 9899-2011)说main
:
5.1.2.2.1程序启动
程序启动时调用的函数名为main。实施 宣布不 这个功能的原型。它应该使用返回类型int和no来定义 参数:
int main(void) { /* ... */ }
或有两个参数(这里称为argc和argv,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):
int main(int argc, char *argv[]) { /* ... */ }
或同等的;
这样就结束了吗? 不,不是那么容易。在引用的末尾是一个小分号,接下来就是这个看似无辜的小部分
或以其他一些实现定义的方式。
“托管”(操作系统及其规则中的第5.1.2.2节)与“独立”(第5.1.2.1节)之间存在差异。例如,对于小型PIC或类似产品,几乎没有任何规则和其余的是实现定义)
函数定义的语法在6.9.1节中定义,其中它读入项目1
在函数定义中声明的标识符(函数的名称)应具有函数类型,由函数定义的声明符部分指定。
第2项进一步详述
函数的返回类型应为void或者是数组类型以外的完整对象类型。
因此任何函数定义(包括main
)都必须指定返回类型。
但是,看看上面或更好的“独立环境”的规则,缺乏它们。