如何实现可以在逗号运算符中的宏

问题描述 投票:0回答:1

宏,说记录一些东西

我希望它可以与“;”独立使用已关注

LOG("hello world");

它可以出现在“operator,()”中

int i = LOG("int"), 42;

我尝试使用 do{}while(0),

#define LOG(str) do{ cout<<str<<endl; }while(0)

但是得到“‘do’之前的预期主要表达式

c++ macros
1个回答
3
投票

这不是你的宏的问题。您还会收到以下错误:

int i = 42 , 42;

错误

<source>:2:17: error: expected unqualified-id before numeric constant
    2 |     int i = 42, 42;
      |                 ^~

语法不会将其解析为逗号运算符。这将是逗号运算符的应用:

int i = (42, 42);

如果您将宏转换为立即调用的 lambda,则可以对宏执行相同的操作:

#include <iostream>
#define LOG(str) [](){ std::cout<<str<<std::endl; }()
int main() {
    int i = (LOG("int"), 42);
}

如果可以避免,就不要使用宏。对于日志记录,常见的用例是使用

__LINE__
__FILE__
,但自 C++20 以来,
std::source_location
使得大多数日志记录宏的使用都过时了。为了避免根据日志级别构造字符串,您可以沿着
log() << "int" << 42 << "blabla";
行使用惰性流(这只会在设置相应的日志级别时构造要记录的字符串)。


如果您确实编写宏,则应该从编写宏应扩展的代码开始。确保它是正确的。然后编写宏,用 gcc 使用

-E
查看它扩展成的代码。换句话说,不要从宏的角度思考,而是从代码的角度思考。

© www.soinside.com 2019 - 2024. All rights reserved.