2013-04-07 79 views
1
int printf (const char *__format, ...) 
{ 
    register int __retval; 
    __builtin_va_list __local_argv; __builtin_va_start(__local_argv, __format); 
    __retval = __mingw_vprintf(__format, __local_argv); 
    __builtin_va_end(__local_argv); 
    return __retval; 
} 

上面的行是stdio庫的一部分,對應於printf函數。當調用printf時,這些被執行。這些線是什麼意思?當執行上述每一行時會發生什麼?Printf不是c語言的一部分。當從stdio.h執行PRINTF的代碼時實際發生了什麼?

+1

其中大部分可以通過閱讀可變參數函數來回答。 – chris 2013-04-07 06:15:44

+0

如果您有興趣瞭解如何實現'printf()',我最近編寫的實現可以在以下網址查看:https://github.com/duskwuff/lm-project0/blob/master/stdio.c – duskwuff 2013-04-07 06:33:33

+1

歡迎來到SO。你錯了,'printf' *是* C語言的一部分。它在標準文件中被指定爲C的組成部分。平臺如何實現語言的庫部分完全取決於他們。通常這些實現是棘手的,不容易閱讀。如果你是C語言的初學者,你可能應該用更簡單的代碼開始閱讀和編寫C程序。 – 2013-04-07 07:39:25

回答

3

這主要是另一個功能__mingw_vprintf的包裝,它真正的工作。這裏唯一的代碼是重新打包變量參數列表。所以爲了真正看到Mingw是如何做的,你必須看看這個函數和它調用的其他函數。如果您真的對此感興趣,您應該獲得P.J. Plauger的的標準C庫的副本。他告訴你如何使用,寫入和測試標準庫中的每個函數。

通常將庫代碼編譯到目標文件中(就像您的代碼一樣),然後打包爲歸檔格式。當你的程序被鏈接時,所需的庫對象將從存檔中提取出來並寫入相同的可執行文件中。這是一個靜態鏈接的庫。

對於動態鏈接庫,庫代碼歸檔作爲一個整體加載到內存中(並且通常由任何需要使用它的程序共享),並且您的程序在操作系統的幫助下進行庫調用以促進記憶共享。

對於這兩種類型的庫,頭文件只應包含宏,類型和函數原型。它不應該包含任何函數定義(屬於.c文件)。

這是標準庫存在之前printf的一個古老版本:link(< - 這是一個實際可讀的(ish))。奇怪的是,7th-edition版本看起來很像你在上面引述的一個:

#include <stdio.h> 

printf(fmt, args) 
char *fmt; 
{ 
    _doprnt(fmt, &args, stdout); 
    return(ferror(stdout)? EOF: 0); 
} 

在這種情況下,_doprnt用匯編語言實現。

相關問題