让我们说由于某种原因你需要写一个宏:MACRO(X,Y). (我们假设您有一个很好的理由不能使用内联函数.) 您希望此宏模拟对没有返回值的函数的调用.
if (x > y)
MACRO(x, y);
do_something();
Run Code Online (Sandbox Code Playgroud)
if (x > y)
MACRO(x, y);
else
MACRO(y - x, x - y);
Run Code Online (Sandbox Code Playgroud)
do_something();
MACRO(x, y)
do_something();
Run Code Online (Sandbox Code Playgroud)
编写宏的天真方式是这样的:
#define MACRO(X,Y) \
cout << "1st arg is:" << (X) << endl; \
cout << "2nd arg is:" << (Y) << endl; \
cout << "Sum is:" << ((X)+(Y)) << endl;
Run Code Online (Sandbox Code Playgroud)
这是一个非常糟糕的解决方案,它失败了所有三个例子,我不应该解释原因.
忽略宏实际上做的事情,这不是重点.
现在,我经常看到编写宏的方法是将它们用大括号括起来,如下所示:
#define MACRO(X,Y) \
{ \
cout << "1st arg is:" << …Run Code Online (Sandbox Code Playgroud) 我最近注意到GCC/Clang中有一个奇怪的有效C/C++表达式,这是我以前从未见过的。这是C++中的示例,但类似的表达式也适用于C:
int main(){
int z = 5;
auto x = ({z > 3 ? 3 : 2;}); // <-- expression
std::cout << x;
}
Run Code Online (Sandbox Code Playgroud)
它的作用在某种程度上是显而易见的,但我想知道它叫什么。由于它在MSVC中不值得,我猜它是一个非标准扩展。但是有什么东西也适用于MSVC吗?特别是在C?