標準做法是使用argv
來訪問命令行參數。您可能會發現在某些體系結構中還有其他方法可以做到這一點,但它們不太可能是可移植的,在這裏似乎沒有太多理由不遵循標準慣例。要讀取值到一個int您可以使用strtol
long n = strtol(argv[1], NULL, 0);
(請注意,我傾向於使用strtol
因爲你已經在投入多一點控制和錯誤處理更喜歡atoi
- 但不是很多)
您也可以使用流如下:
istringstream ss(argv[1]);
long n;
ss >> n;
兩個事情並關心我你正在試圖做什麼,雖然:首先你想要的變量值,設置在運行時函數被封裝。從邏輯上講,這會使你的代碼不易維護,因爲你的函數和一個外部影響(一個命令行參數)之間會有一個不可見的依賴關係 - 所以你的函數的確定性屬性會受到影響。實際上,這會讓測試你的功能變得更加困難 - 尤其是使用自動化單元測試,因爲在運行之前,沒有辦法設置該值。其次,如果要複合這一點,您正在尋求將a
變量的範圍限制爲未命名名稱空間內的編譯單元。這有兩個不良影響。首先,沒有任何測試工具或任何其他代碼能夠從自動UT的角度再次看到這個變量,這是非常糟糕的。其次,a
在您的編譯單元中成爲有效的「全局」。在這個編譯單元的函數中,使用a
的方式和時間會非常棘手,這對維護你的代碼的任何人來說都有點頭痛。我會假設你沒有使用多線程,這真的會導致問題。
我想知道爲什麼你不想通過argv[1]
到print_from_external_file()
的原因,但我真的認爲這是最好的事情。如果你不覺得你可以直接通過這個變量作爲字符串或轉換爲int,你可以考慮創建可能在傳遞一個命令行參數或配置對象:
configuration c(argc, argv); // This contains the hard work of parsing the CL
print_from_external_file(c);
這隱藏了大部分的解析命令行的努力工作。更好的是它可以讓你給CL參數增加真正的含義。比方說,在a
變量表示目錄號,您configuration
類的構造函數可以簡單地這樣做:
configuration::configuration(int argc, char* argv[])
{
// ...
catalogNo_ = strtol(argv[1], NULL, 0);
,然後如果訪問添加:
int configuration::get_catalog_no() const { return catalogNo_; }
則變得更加明顯在print_from_external_file()
我們在做什麼:
void print_from_external_file(const configuration& c)
{
cout << c.get_catalog_no() << endl;
}
這是假設a被定義在與main相同的範圍。在我的MWE中情況並非如此。 – BillyJean