首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统调用中的宏

系统调用中的宏
EN

Stack Overflow用户
提问于 2013-06-13 03:08:27
回答 4查看 610关注 0票数 1

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

代码语言:javascript
复制
#define WINX 54
#define WINY 30

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

这样做行得通吗?在代码中使用也安全吗?或者我必须手动构造一个字符串?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-13 03:26:37

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

代码语言:javascript
复制
#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>):

代码语言:javascript
复制
std::ostringstream oss;
oss << "mode con lines=" << WINY << " cols=" << WINX;
system(oss.str().c_str());
票数 5
EN

Stack Overflow用户

发布于 2013-06-13 03:15:33

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

代码语言:javascript
复制
system("mode con lines=WINY cols=WINX");  

不会扩展到

代码语言:javascript
复制
system("mode con lines=30 cols=54");
票数 3
EN

Stack Overflow用户

发布于 2013-06-13 04:21:57

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

代码语言:javascript
复制
#define WINX "54"
#define WINY "30"

int main()
{
system("mode con lines=" WINY " cols=" WINX);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17073389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档