由於系統調用C(比如說printf())的任何庫函數都依賴於OS,這是否意味着我們對不同的OS有不同的函數printf()?在C庫函數中調用系統
0
A
回答
2
這取決於你的「與衆不同」的定義,因爲我覺得至少在三個層次區別的:
- 接口差異
- 高級代碼差異
- 機代碼差異
C標準提出了一個接口,並且該接口應該在整個板上受到尊重。這意味着對於任何帶有C標準庫的操作系統,操作系統都應該向您的程序展示一個名爲printf
的插座,並且如果您的程序插入其中,則可以期望它的行爲與文檔相同。這意味着,對於你所關心的全部,printf
是一樣的。
這並不意味着printf
必須是每個標準庫中相同的一段代碼。如果有人告訴我寫一個printf
函數,並告訴你編寫一個printf
函數,我們可以採用不同的方法,只要我們都尊重記錄的行爲,那也可以。事實上,出於版權原因,您可以確定Windows的代碼printf
與Linux的代碼printf
不同。
最後,即使使用相同的源代碼,printf
必須有所不同才能適應平臺差異。例如,您不能指望x86 printf
在ARM上工作。正如您所指出的,由於平臺約定和系統調用差異,您不能指望Linux在Windows上工作。
因此,printf
插座背後的機器代碼將有所不同,但標準的重點是使其工作相同。
1
如果你「在不同的操作系統printf
行爲不同」的意思,那麼答案是:
- 外部(從功能觀點的用戶)沒有,它的語義是標準化的。這意味着對這樣一個函數的一個特定的調用會導致相同的結果,不管操作系統是什麼。
- 內部可能,其實現是免費的。這意味着,這樣一個函數真正能夠產生結果的計算可能是不同的。
相關問題
- 1. 系統()函數不從LD_PRELOAD'ed庫調用
- 2. 系統調用在C++中
- 3. 系統調用vs函數調用
- 4. 系統調用庫
- 5. C編譯器如何決定是否調用庫函數或系統調用
- 6. 在C系統調用
- 7. 調用C「系統」 ++
- 8. 爲strcpy或strcat C++函數調用哪個系統調用?
- 9. C標準庫和系統調用
- 10. 程序集分析系統()中調用的函數C
- 11. 系統狀態函數C#
- 12. pause()系統調用的系統調用處理函數在哪裏?
- 13. 在vimscript中調用C++庫函數
- 14. 從系統調用用C
- 15. 系統()調用用C
- 16. 用execve在C中調用mkdir系統調用C
- 17. 系統函數調用異步?
- 18. 調用系統()函數,Vim腳本
- 19. 如何用C語言重寫一個函數(系統調用)?
- 20. 如何在每個系統或庫函數調用中使GDB中斷?
- 21. linux系統調用getpeername C++
- 22. fork()系統調用c
- 23. 與c的系統調用
- 24. Unix系統調用Objective-C
- 25. C++:重複調用系統()
- 26. C++等待系統調用
- 27. Linux系統調用getifaddr C++
- 28. 在系統調用之前將被調用的註冊函數
- 29. 使用c庫函數的系統時間設置
- 30. 用Java統一調用函數C#Android
所以在現實中,我們有不同的代碼在Windows和Linux中的printf()函數? – 2015-02-24 15:44:23
是的他們的實現是不同的。 – 2015-02-24 15:55:53