我正在学习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 }
Run Code Online (Sandbox Code Playgroud)
g++ -o sample ./*
./sample --help
Run Code Online (Sandbox Code Playgroud)
输出:用法:coffee --help --version
./sample --version
Run Code Online (Sandbox Code Playgroud)
输出:
I'm confused why --version没有输出字符串alpha.
何时std::cout << x << std::endl ; exit(-1)通过这两行中的宏预处理器进行扩展
9 if(argc<2||!strcmp(argv[1],"--help"))
10 die(help);
Run Code Online (Sandbox Code Playgroud)
结果代码是:
if(argc<2||!strcmp(argv[1],"--help"))
std::cout << help << std::endl;
exit(-1);
Run Code Online (Sandbox Code Playgroud)
这可能不是你想要的;
"多do { ... } while(0)语句宏"的常见技巧是在宏中使用您想要的语句.
您可以使用gcc -E或cl -E从C预处理器获取输出,这样您就可以看到编译器实际看到的内容.
编辑:我应该指出,在这种情况下,我个人更喜欢"死(msg)函数"而不是修复宏.然后,你可以,例如,在die()中设置一个breakpoing,并找出当某些东西不正常时你是如何到达那里的!您无法在宏中设置断点.