系统调用中的宏

Macros in system calls

本文关键字:系统调用      更新时间:2023-10-16

在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());

宏当然不会在字符串中展开。因此,这个

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的答案显示了如何做到这一点。