最近回看了一本C语言方面的书,准备复习一下C语言的基础知识,正如大多数C语言课本一样,第一个例子总是简单的"Hello World",如下:
main()
{
printf("Hello World!\n"); //输出字符串并换行
}
现在再看这个例子,就会发现有几个问题。首先,C语言中每个函数都会返回值,包括空类型。上面的例子中,虽然没有指明main函数的返回值类型,编译器会使用默认的空类型作为返回值。但是,这显然会给初学者造成疑惑,是不是所有函数都可以这样写,表示没有返回值呢?对于这个简单的例子,应该改写如下:
void main()
{
printf("Hello World!\n"); //输出字符串并换行
return (void);
}
上面代码显示的告诉编译器,main函数的返回值类型会void型,并显示调用return语句。这样的好处就是统一各函数的书写风格,符合C语言的规范。
众所周知,main函数是程序的入口函数,是由系统调用的,在Win32中则是由C Runtime的Startup代码调用的。虽然整个程序中也不会用到main函数的返回值,但是我们不能确定系统在调用main后会不会使用该返回值。例如,当我们调用CreateProcess创建一个进程时,系统会调用指定程序的main函数,当程序退出时,再调用GetProcessExitCode函数获取该程序的返回值,以判断程序是否执行成功,这里,系统就会将main函数的返回值返回给我们。正如上面的例子所示,main函数返回的是空类型,那它是什么值呢?
也许系统会返回一个随机的值给我们,但是我们也就不能判断这个程序执行是否成功了。所以,main函数的最好能够有一个明确的返回值,如int型,这也正是main函数的正确声明,如下:
int main()
{
printf("Hello World!\n"); //输出字符串并换行
if (...) //成功返回0
{
...
return err;
}
else
{
...
return err; //出错返回错误码
}
}
可以举一反三的是,在写自定义函数时,最好也能够指定一个返回值,表明程序是否执行正确,在这一点上Windows的API函数就是很好的例子,大多数API函数都会返回一DWORD值,表明函数是否执行成功,而数据的传递都是通过参数进行的,包括输入、输出参数,而返回值值表明是否执行成功。
转载于:https://blog.51cto.com/jslmes/1175814