系统调用中的宏
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
)扩展为定义的参数,然后将其传递给STR
。STR
只使用字符串化宏操作符,其结果是字符串字面值。在对代码进行标记并编译为目标代码之前,编译器将相邻的字符串字面值连接成单个字符串。
如果宏是比简单数字更复杂的东西,则需要手动构造一个字符串。在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的答案显示了如何做到这一点。
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 如何将C++系统调用连接到 freertos
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 系统调用:一次和多次,哪个更好?
- 使用路径和空格的系统调用
- 是否有等效于 macOS 上的 clone() 系统调用?
- 从C++调用系统调用节点?
- C++测试程序中的非法系统调用(对角矩阵元素程序的总和)
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用低级系统调用从 stdin 和输入文件中获取字节数
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- 动态执行的 ARM ASM 系统调用,可从C++重新定位
- 如何知道我正在使用的Linux OS是否具有特定的系统调用
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- 调用系统调用函数时出现异常
- 在 boost::asio 中自定义套接字/关闭系统调用
- 系统调用失败"Incorrect Section Name -e" C++
- 绕过系统调用 C++
- 以非 root 用户身份调用 mount() 系统调用