1
「printfのは」本当に印刷された文字の数を返しますので、私は持っていた:
#include<stdio.h>
int main()
{
printf("1");
printf("55555");
printf("10________");
printf("13___________");
printf("18________________");
printf("28__________________________");
}
このプログラムは出力
15555510________13___________18________________28__________________________
それから私は、GDBでそれをデバッグし、GDBの戻り値をチェックしようとしただろう:
(gdb) b main
Breakpoint 1 at 0x804844c: file testp.c, line 4.
(gdb) r
Starting program: /home/a/cpp/a.out
Breakpoint 1, main() at testp.c:4
4 printf("1");
(gdb) n # will return "1" to $eax
5 printf("55555");
(gdb) p $eax # I expect it will print "1" here, wrong!
$1 = 49
(gdb) n
6 printf("10________");
(gdb) p $eax # I expect it will print "5" here, right!
$2 = 5
(gdb) n
7 printf("13____________");
(gdb) p $eax # I expect it will print "10" here, right!
$3 = 10
最初のprintfが実行されたときにわかるように、$ eax値は私の期待通りではありません。後の値は正しいと思われる。 これはなぜですか?なぜ最初にprintfが "1"を$ eaxに返さないのですか?私はCスタイルのABIが$ eaxに戻り値を格納すると思います。
ありがとうございます。-fno-builtin-printfは私の仕事です。私はちょうど混乱していました、私は "-O"オプションを使用しなかった、または最適化を行いました、なぜgccはまだいくつかの最適化をしていますか?手動で完全に無効にするには? – Troskyvs
'-O0'を指定しても、' -fno-builtin'または 'no-builtin-nameoffunc'オプションを指定しない限り、gccは' printf'や 'strcpy'のような標準関数の代わりに同等の効率的なコードを使います。 –