Учитывая, что эти строки включены в ваш код, да, возможно, макрос
#include <iostream>
#include <sstream>
__LINE__
определяется всеми стандартными компиляторами.Таким образом, мы можем использовать его для генерации имени переменной, которое будет отличаться при каждом использовании макроса:)
Вот новая версия, которая рассматривается только как инструкция с одним оператором: (EDITED)
#define Var_(Name, Index) Name##Index
#define Var(Name, Index) Var_(Name, Index)
#define my_macro \
for (struct { int x; std::ostringstream oss; } Var(s, __LINE__) = { 0 }; \
Var(s, __LINE__).x<2; ++Var(s, __LINE__).x) \
if (Var(s, __LINE__).x==1) ThreadSafeLogging(Var(s, __LINE__).oss.str()); \
else Var(s, __LINE__).oss
// So you can use it like this
int main()
{
if (4 != 2)
my_macro << 4 << " hello " << std::endl;
my_macro << 2 << " world !" << std::endl;
}
Вероятно, Developper не нужно будет использовать этот макрос дважды в одной строке из-за простоты оператора <<
.Но если вам это нужно, вы можете переключить использование __LINE__
на __COUNTER__
(что не является стандартным!).Спасибо Quuxplusone за этот совет