一个或者多个字的返回值

    假如main()函数的返回值是void而不是int会怎么样?

    通常启动函数调用main()为:

    换句话说为

    如果main()声明为void类型并且函数没有明确返回状态值,通常在main()结束时EAX寄存器的值被返回,然后作为exit()的参数。大多数情况下函数返回的是随机值。这种情况下程序的退出代码为伪随机的。

    我们看一个实例,注意main()是void类型:

    1. #include <stdio.h>
    2. void main()
    3. {
    4. printf ("Hello, world!");
    5. };

    GCC 4.8.1会使用puts()替代printf()(看前面章节2.3.3),没有关系,因为puts()会返回打印的字符数,就行printf()一样。请注意,main()结束时EAX寄存器的值是非0的,这意味着main()结束时保留puts()返回时EAX的值。

    Listing 8.1: GCC 4.8.1

    1. .LC0:
    2. .string "Hello, world!"
    3. main:
    4. push ebp
    5. mov ebp, esp
    6. and esp, -16
    7. sub esp, 16
    8. mov DWORD PTR [esp], OFFSET FLAT:.LC0
    9. call puts
    10. leave
    11. ret

    我们写bash脚本来看退出状态:

    Listing 8.2: tst.sh

    运行:

    1. $ tst.sh
    2. Hello, world!
    3. 14

    14为打印的字符数。

    小例子:

    1. {
    2. int a;
    3. int b;
    4. int c;
    5. };
    6. struct s get_some_values (int a)
    7. {
    8. struct s rt;
    9. rt.a=a+1;
    10. rt.b=a+2;
    11. rt.c=a+3;
    12. return rt;
    13. };

    …我们可以得到(MSVC 2010 /Ox):

    内部变量传递指针到结构体的宏为$T3853。

    这个例子可以用C99语言扩展来重写:

    1. struct s
    2. {
    3. int a;
    4. int b;
    5. };
    6. struct s get_some_values (int a)
    7. {
    8. return (struct s){.a=a+1, .b=a+2, .c=a+3};
    9. };

    Listing 8.3: GCC 4.8.1

    1. _get_some_values proc near
    2. ptr_to_struct = dword ptr 4
    3. a = dword ptr 8
    4. mov edx, [esp+a]
    5. mov eax, [esp+ptr_to_struct]
    6. lea ecx, [edx+1]
    7. mov [eax], ecx
    8. lea ecx, [edx+2]
    9. add edx, 3
    10. mov [eax+4], ecx
    11. mov [eax+8], edx
    12. retn

    我们可以看到,函数仅仅填充调用者申请的结构体空间的相应字段。因此没有性能缺陷。 # 指针