在c ++中,在系统调用中使用宏是否可行且安全?以下面的代码为例:
#define WINX 54
#define WINY 30
int main()
{
system("mode con lines=WINY cols=WINX");
...
这样可以安全地在代码中使用吗?或者我是否必须手动构造一个字符串?
答案 0 :(得分: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
(来自<sstream>
):
std::ostringstream oss;
oss << "mode con lines=" << WINY << " cols=" << WINX;
system(oss.str().c_str());
答案 1 :(得分:3)
宏肯定不会在字符串中扩展。所以,这个
system("mode con lines=WINY cols=WINX");
不会扩展为
system("mode con lines=30 cols=54");
答案 2 :(得分:1)
如果您不需要WINX和WINY的实际十进制值,您可以在执行期间连接静态字符串并节省资源:
#define WINX "54"
#define WINY "30"
int main()
{
system("mode con lines=" WINY " cols=" WINX);
答案 3 :(得分:0)
你必须手动构建一个字符串。
例如:
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's answer显示了如何执行此操作。