[英]Macros in system calls
在C ++中,在系統調用中使用宏是否可能且安全? 以以下代碼為例:
#define WINX 54
#define WINY 30
int main()
{
system("mode con lines=WINY cols=WINX");
...
這樣可以正常工作並且可以在代碼中安全使用嗎? 還是我必須手動構造一個字符串?
宏不會在字符串文字內擴展。 相反,您可以使用另一個宏將宏擴展為字符串文字,並使用字符串文字串聯來創建所需的字符串:
#define STR2(x) STR(x)
#define STR(x) #x
const char *cmd = "mode con lines=" STR2(WINY) " cols=" STR2(WINX);
system(cmd);
STR2
將提供的參數(例如WINY
)擴展為定義為的參數,然后將其傳遞給STR
。 STR
僅使用字符串化宏運算符,其結果是字符串文字。 在將代碼標記化並編譯為目標代碼之前,編譯器會將相鄰的字符串文字串接到單個字符串中。
如果宏比簡單數字復雜,那么您需要手動構造一個字符串。 在C ++中,最簡單的方法是使用ostringstream
(來自<sstream>
):
std::ostringstream oss;
oss << "mode con lines=" << WINY << " cols=" << WINX;
system(oss.str().c_str());
宏當然不會在字符串中擴展。 所以這
system("mode con lines=WINY cols=WINX");
不會擴展為
system("mode con lines=30 cols=54");
如果不需要WINX和WINY的實際十進制值,則可以連接靜態字符串並在執行期間節省資源:
#define WINX "54"
#define WINY "30"
int main()
{
system("mode con lines=" WINY " cols=" WINX);
您必須手動構造一個字符串。
例如:
char command[100];
int result;
sprintf(command, "mode con lines=%d cols=%d", WINY, WINX);
result = system(command);
不要忘記必需的include指令:
#include <stdio.h>
#include <stdlib.h>
請咨詢您的系統的文檔返回的值的意義system
。
確保command
數組足夠大以容納完整的命令-或者,最好使用std::string
代替。 jxh的答案顯示了如何執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.