- 论坛徽章:
- 0
|
printf为什么会这样?
思兄:
不必客气,你我讨论都是想把问题弄清楚而已。也祝你新年快乐。
我用的就是默认编译选项,即
如果我用了特殊选项,一定会说明的。
gcc 可以用 attribute 来修饰一个函数,并改变起参数传递行为。但在我印象里,只能选择 __cdecl 和 stdcall。我没有使用任何修饰,此外,attribute 修饰肯定超出了标准 c 的范围,是实现相关的。c 标准中没有任何地方提到了 cdecl 或 stdcall。再此外,一些平台上的 gcc 不支持这种修饰。
关掉寄存器优化的选项我没有见到 (ppc),我估计不会有的。你想,printf 的代码是编译好了的,如果我改动编译选项就使传递方式发生改变,则 printf 必须至少有两个预编译版本。当然,对自己写的函数,有可能改动。但我用的都是默认的方式。
- #include <stdio.h>;
- func(int i1, int i2, int i3, int i4,...)
- {
- int k;
- printf("&k = %p &1 %p &2 %p &3 %p &4 %p\n", &k, &i1, &i2, &i3, &i4);
- }
- main()
- {
- int i = 0;
- printf("%d %d %d\n", i++, i++, i++);
- func(1, 2, 3, 4, 5, 6, 7, 8);
- }
复制代码
cc -ggdb 是我能想到的最糟糕的编译方式了。
原帖由 "ppc" 发表:
[zxl@PPC src]$ gcc -v
Reading specs from /usr/lib/gcc-lib/ppc-yellowdog-linux/3.2.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=ppc-yellowdog-linux
Thread model: posix
gcc version 3.2.2 20030217 (Yellow Dog Linux 3.0 3.2.2-2a)
[zxl@PPC src]$ gcc -ggdb syk.c
[zxl@PPC src]$ ./a.out
0 1 2
&k = 0x7ffffa60 &1 0x7ffffa50 &2 0x7ffffa54 &3 0x7ffffa58 &4 0x7ffffa5c
[zxl@PPC src]$
原帖由 "x86_64" 发表:
[zxl@AMD64 cu]$ gcc -v
Reading specs from /usr/lib64/gcc/x86_64-mandrake-linux-gnu/3.4.1/specs
Configured with: ../configure --prefix=/usr --libdir=/usr/lib64 --with-slibdir=/lib64 --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --enable-long-long --enable-__cxa_atexit --enable-clocale=gnu --disable-libunwind-exceptions --enable-languages=c,c++,ada,f77,objc,java --host=x86_64-mandrake-linux-gnu --with-system-zlib
Thread model: posix
gcc version 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)
[zxl@AMD64 cu]$ gcc -ggdb syc.c
[zxl@AMD64 cu]$ ./a.out
2 1 0
&k = 0x7fbffff32c &1 0x7fbffff33c &2 0x7fbffff338 &3 0x7fbffff334 &4 0x7fbffff330
[zxl@AMD64 cu]$
行为是不一样的。
>;>; 思兄,你所做的观测都是在 x86 平台上的。在该平台上,参数多数都是从右到左处理的。这点我不否认。
>;>; pascal 在 x86 平台上也一般从左到右处理参数,因为它不需要支持可变参数个数。 |
|