系统调用中的宏 在C++中,在系统调用中使用宏是否可能和安全?以以下代码为例: #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);

系统调用中的宏 在C++中,在系统调用中使用宏是否可能和安全?以以下代码为例: #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);,c++,c,macros,system,C++,C,Macros,System,在代码中使用它是否有效且安全?或者我必须手动构造字符串吗?宏当然不会在字符串中展开。那么这个 system("mode con lines=WINY cols=WINX"); 不会扩展到 system("mode con lines=30 cols=54"); 宏当然不会在字符串中展开。那么这个 system("mode con lines=WINY cols=WINX"); 不会扩展到 system("mode con lines=30 cols=54"); 您必须手动构造一个

在代码中使用它是否有效且安全?或者我必须手动构造字符串吗?

宏当然不会在字符串中展开。那么这个

system("mode con lines=WINY cols=WINX");  
不会扩展到

system("mode con lines=30 cols=54");

宏当然不会在字符串中展开。那么这个

system("mode con lines=WINY cols=WINX");  
不会扩展到

system("mode con lines=30 cols=54");

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

例如:

#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>
有关系统返回值的含义,请参阅系统文档


确保命令数组足够大,可以容纳完整的命令,或者最好使用std::string。演示如何执行此操作。

您必须手动构造字符串

例如:

#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>
有关系统返回值的含义,请参阅系统文档


确保命令数组足够大,可以容纳完整的命令,或者最好使用std::string。演示如何执行此操作。

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

#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++中,最简单的方法是使用OSTRIGNSWATH:


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

#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++中,最简单的方法是使用OSTRIGNSWATH:


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

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

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

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

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

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

我认为OP并不重要,但是在运行时没有真正的理由。C++没有定义一个StAMTF的版本,它在STD::String上工作。演示如何做这件事,比我的更好。我认为OP并不重要,但是在运行时没有真正的理由。C++没有定义一个StAMTF的版本,它在STD::String上工作。显示了如何做到这一点,并且比我的要好。值得一提的是,STR2WINY扩展为字符串文本,并且在编译的早期阶段将相邻的字符串文本连接在一起。您可能还想提到,宏不会在字符串文本中展开,这就是为什么这种方法是必要的。预处理器不应该在将字符串传递给系统之前构造字符串,所以我应该能够使用systemmode con lines=STR2WINY cols=STR2WINX@user2403132:是的,但是您必须告诉预处理器构造字符串;这就是mode con lines=STR2WINY cols=STR2WINX所做的。您可以将其直接传递给系统;cmd声明并不是真的必要。@user2403132:对Keith说的是。我将它分离为一个单独的变量,只是为了减少混乱,但这不是必需的。值得一提的是,STR2WINY扩展为字符串文本,相邻的字符串文本在编译的早期阶段连接在一起。您可能还想提到,宏不会在字符串文本中展开,这就是为什么这种方法是必要的。预处理器不应该在将字符串传递给系统之前构造字符串,所以我应该能够使用systemmode con lines=STR2WINY cols=STR2WINX@user2403132:是的,但是您必须告诉预处理器构造字符串;这就是mode con lines=STR2WINY cols=STR2WINX所做的。您可以将其直接传递给系统;cmd声明并不是真的必要。@user2403132:对Keith说的是。我将它分离成一个单独的变量,只是为了减少混乱,但这不是必需的。