簡體   English   中英

系統調用中的宏

[英]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.

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