1

在 c++ 中,在系统调用中使用宏是否可能且安全?以下面的代码为例:

#define WINX 54
#define WINY 30

int main()
{
system("mode con lines=WINY cols=WINX");
...

这会起作用并且可以安全地在代码中使用吗?还是我必须手动构造一个字符串?

4

4 回答 4

5

宏不会在字符串文字内展开。相反,您可以使用另一个宏将宏扩展为字符串文字,并使用字符串文字连接来创建所需的字符串:

#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(from <sstream>):

std::ostringstream oss;
oss << "mode con lines=" << WINY << " cols=" << WINX;
system(oss.str().c_str());
于 2013-06-12T19:26:37.377 回答
3

宏当然不会在字符串中扩展。所以这

system("mode con lines=WINY cols=WINX");  

不会扩展到

system("mode con lines=30 cols=54");
于 2013-06-12T19:15:32.853 回答
1

如果不需要 WINX 和 WINY 的实际十进制值,可以连接静态字符串,在执行期间节省资源:

#define WINX "54"
#define WINY "30"

int main()
{
system("mode con lines=" WINY " cols=" WINX);
于 2013-06-12T20:21:57.307 回答
0

您必须手动构造一个字符串。

例如:

char command[100];
int result;
sprintf(command, "mode con lines=%d cols=%d", WINY, WINX);
result = system(command);

不要忘记所需的包含指令:

#include <stdio.h>
#include <stdlib.h>

请查阅系统文档以了解system.

确保command数组足够大以容纳完整的命令——或者,可能更好的是,使用它std::stringjxh 的回答显示了如何做到这一点。

于 2013-06-12T19:24:10.383 回答