在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)扩展为定义为的参数,然后将其传递给STRSTR仅使用字符串化宏运算符,其结果为字符串文字。在将代码标记化并编译为目标代码之前,编译器会将相邻的字符串文字串接到单个字符串中。

如果宏比简单的数字复杂,那么您需要手动构造一个字符串。在C++中,最简单的方法是使用ostringstream(来自<sstream>):
std::ostringstream oss;
oss << "mode con lines=" << WINY << " cols=" << WINX;
system(oss.str().c_str());

09-06 14:33