在c++中,在系统调用中使用宏是可能且安全的吗?以下面的代码为例:
#define WINX 54
#define WINY 30
int main()
{
system("mode con lines=WINY cols=WINX");
...这样做行得通吗?在代码中使用也安全吗?或者我必须手动构造一个字符串?
发布于 2013-06-13 03:26:37
宏不会在字符串文字中展开。相反,您可以使用另一个宏将宏展开为字符串文字,并使用字符串文字连接来创建所需的字符串:
#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());发布于 2013-06-13 03:15:33
宏当然不会在字符串中展开。所以,这个
system("mode con lines=WINY cols=WINX"); 不会扩展到
system("mode con lines=30 cols=54");发布于 2013-06-13 04:21:57
如果您不需要WINX和WINY的实际十进制值,您可以连接静态字符串并在执行期间节省资源:
#define WINX "54"
#define WINY "30"
int main()
{
system("mode con lines=" WINY " cols=" WINX);https://stackoverflow.com/questions/17073389
复制相似问题