宏,说记录一些东西
我希望它可以与“;”独立使用已关注
LOG("hello world");
它可以出现在“operator,()”中
int i = LOG("int"), 42;
我尝试使用 do{}while(0),
#define LOG(str) do{ cout<<str<<endl; }while(0)
但是得到“‘do’之前的预期主要表达式
这不是你的宏的问题。您还会收到以下错误:
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
查看它扩展成的代码。换句话说,不要从宏的角度思考,而是从代码的角度思考。