簡體   English   中英

argc 和 argv 的值從哪里來

[英]From where does the value of argc and argv comes in the main function c++

我是 c++ 的新手,我已經看到許多 c++ 編譯器自動將 int argc,char* argv 作為主要 function 中的參數傳遞,但它們在哪里定義? 有點好奇想知道。

這些通常由 shell 提供,或者更具體地說,由父進程提供。 那就是父進程可以決定要傳遞哪些參數(如果有)。 這些出現在argc / argv中。 請參閱exec函數系列,以了解從父進程的角度來看它的外觀。 還有用於啟動進程的 kernel 版本。

它們是由操作系統及其進程間機制專門定義並最終提供的。 這是定義main() function 的 C++ 標准的一部分。

This mechanism is inherited from the C version of same, and that's largely a byproduct of how UNIX itself was designed since C and UNIX were produced in tandem.

請閱讀一本好的C++ 編程書,然后查看此 C++ 參考和一些 C++ 標准,如n3337或更好。

您的編譯器(例如GCC )不會將argcargv參數添加到main 使用gcc -Wall -Wextra -g檢查main是否有這些 arguments (但您可以在 Linux 上定義int main(void)int main(int argc, char**argv, char**environ) )。 重要的是main的簽名,而不是 arguments 的確切名稱(只是它們的類型和編號)。

您的操作系統(例如 Linux 及其kernel )正在將這些傳遞給您的main 在 Linux 上,程序由execve(2)啟動,該系統調用將參數傳遞給main 從技術上講,調用堆棧的初始布局在 ABI 中指定。 一些crt0初始化代碼正在調用main (和 static 構造函數)。 該初始化代碼是用匯編程序編寫的。 閱讀一本好的操作系統教科書

有時,C++ 以獨立模式使用。 然后,沒有main其他約定適用。 一個典型的例子是當您在 C++ 中編寫操作系統 kernel 時(參見OSDEV示例)

由於GCC , Linux kernelGNU libc是免費軟件,您可以下載它們的源代碼並研究它。 另請參閱LinuxFromScratch

學習 - 獲取靈感 - 現有 C++ 開源項目的源代碼,如QtFLTKRefPerSys等。對於RefPerSys,請通過 email basile@starynkevitch.net我到

我是 c++ 的新手,我已經看到許多 c++ 編譯器自動將 int argc,char* argv 作為主要 function 中的參數傳遞,但它們在哪里定義?

它們是 C 和 C++ 標准的一部分。 具體如何將它們提供給main() function 將取決於操作系統。 例如,在類 Unix 系統中, fork()和某些版本的exec()的組合用於創建一個新進程,然后在該新進程的上下文中加載和執行您的程序,arguments 到新程序過去了。 其他操作系統將以其他方式啟動新進程,但argcargv參數仍將來自啟動您的程序的程序,無論是面向命令的 shell、某些 GUI 桌面管理器還是其他。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM