由於系統調用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. 在C系統調用
- 5. 調用C「系統」 ++
- 6. C標準庫和系統調用
- 7. 程序集分析系統()中調用的函數C
- 8. pause()系統調用的系統調用處理函數在哪裏?
- 9. 系統狀態函數C#
- 10. 系統()調用用C
- 11. 如何用C語言重寫一個函數(系統調用)?
- 12. 如何在每個系統或庫函數調用中使GDB中斷?
- 13. 在系統調用之前將被調用的註冊函數
- 14. Linux系統調用getifaddr C++
- 15. 與c的系統調用
- 16. linux系統調用getpeername C++
- 17. Unix系統調用Objective-C
- 18. fork()系統調用c
- 19. 使用c庫函數的系統時間設置
- 20. GetOpenFileName和系統函數調用運行時錯誤C++ win32 api
- 21. Linux下C++系統()調用崩潰時,函數返回
- 22. C++回調系統
- 23. C#當量至C`系統()`標準庫函數
- 24. C庫存系統數據庫#
- 25. C - 系統函數調用後將SHELL輸出保存在文件中
- 26. 消息隊列。 msgsend msgrcv。系統V在C系統調用(Linux)
- 27. CHDIR系統調用在C程序
- 28. 「C系統調用」和「C庫例程」有什麼區別?
- 29. 有執行程序和調用函數統一的系統嗎?
- 30. 函數調用像read(),write()在linux中的實際系統調用?
所以在現實中,我們有不同的代碼在Windows和Linux中的printf()函數? – 2015-02-24 15:44:23
是的他們的實現是不同的。 – 2015-02-24 15:55:53