0

我正在学习 c++,宏的行为不像预期的那样。

  1     #include<cstdlib>
  2     #include<iostream>
  3     #include<cstring>
  4     #define die(x) std::cout << x << std::endl ; exit(-1) 
  5     const char *help = "Usage: coffee --help --version";
  6     const char *version = "alpha";
  7     int main(int argc,char **argv)
  8     {
  9               if(argc<2||!strcmp(argv[1],"--help"))
 10                       die(help);
 11               if(!strcmp(argv[1],"--version"))
 12                       die(version);
 13 
 14               return 0;
 15               
 16     }

g++ -o sample ./*
./sample --help

输出:用法:coffee --help --version

./sample --version  

输出


我很困惑为什么--version不输出 string alpha

4

4 回答 4

6

std::cout << x << std::endl ; exit(-1)这两行中的宏预处理器何时扩展

 9               if(argc<2||!strcmp(argv[1],"--help"))
 10                       die(help);

结果代码是:

 if(argc<2||!strcmp(argv[1],"--help"))
       std::cout << help << std::endl; 
 exit(-1); 

这可能不是您想要的;

“多语句宏”的常见技巧是do { ... } while(0)围绕您希望在宏中包含的语句使用。

您可以使用gcc -Ecl -E从 C 预处理器获取输出,因此您可以看到编译器实际看到的内容。

编辑:我应该指出,在这种情况下,我个人更喜欢“die(msg)函数”而不是修复宏。然后你可以,例如,在 die() 中设置一个断点,并找出当某些东西不能正常工作时你是如何到达那里的!您不能在宏中设置断点。

于 2012-12-31T13:48:41.613 回答
0

只需尝试粗暴地替换宏的主体,您就会明白为什么:

if(argc<2||!strcmp(argv[1],"--help"))
  die(help);

变成:

if(argc<2||!strcmp(argv[1],"--help"))
  std::cout << help << std::endl;
exit(-1);

{ }该语句没有大括号if,主体仅由一条指令组成,因此exit(-1)始终执行。

您会发现,如果使用 anif / else if而不是 that 和if / ifcouple,因为第二个else if会错过它的父母。

于 2012-12-31T13:48:55.483 回答
0

你忘了{ }。手动展开宏,你会看到结果:

if(argc<2||!strcmp(argv[1],"--help"))
   std::cout << help << std::endl ; exit(-1);

IE

if(argc<2||!strcmp(argv[1],"--help"))
   std::cout << help << std::endl ;
exit(-1);
于 2012-12-31T13:49:12.300 回答
0

替换宏后的代码

if(argc<2||!strcmp(argv[1],"--help"))
   std::cout << help << std::endl ; exit(-1) ;  //<-- this exit will work always.
if(!strcmp(argv[1],"--version"))
   std::cout << version << std::endl ; exit(-1) ;

正确方法:

#define die(x) do {std::cout << x << std::endl ; exit(-1); } while(false);
于 2012-12-31T13:50:25.970 回答