最近回看了一本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值,表明函数是否执行成功,而数据的传递都是通过参数进行的,包括输入、输出参数,而返回值值表明是否执行成功。