[英]Pass (argc, argv) variables to a function as (argv, argc) inside main in C++
[英]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 )不會將argc
和argv
參數添加到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 kernel和GNU libc是免費軟件,您可以下載它們的源代碼並研究它。 另請參閱LinuxFromScratch 。
學習 - 獲取靈感 - 現有 C++ 開源項目的源代碼,如Qt 、 FLTK 、 RefPerSys等。對於RefPerSys,請通過 email basile@starynkevitch.net
我到
我是 c++ 的新手,我已經看到許多 c++ 編譯器自動將 int argc,char* argv 作為主要 function 中的參數傳遞,但它們在哪里定義?
它們是 C 和 C++ 標准的一部分。 具體如何將它們提供給main()
function 將取決於操作系統。 例如,在類 Unix 系統中, fork()
和某些版本的exec()
的組合用於創建一個新進程,然后在該新進程的上下文中加載和執行您的程序,arguments 到新程序過去了。 其他操作系統將以其他方式啟動新進程,但argc
和argv
參數仍將來自啟動您的程序的程序,無論是面向命令的 shell、某些 GUI 桌面管理器還是其他。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.