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