__func__ в локальной структуре
От: B0FEE664  
Дата: 23.08.22 13:22
Оценка:
Это валидный код или же предупреждение по делу и так нельзя?:
  Скрытый текст
template<unsigned int N_LIMIT, class TLogData>
void LogErr(std::string strLog)
{
   static std::atomic<unsigned int> nCounter{};
   if ( nCounter <= N_LIMIT )
   {
      if ( nCounter == N_LIMIT )
      {
         strLog += " The message limit exceeded. The logging of this message has been stopped.";
      }
      const TLogData logData{};
      std::cout() << strLog << " file: \"" << logData._file << "\" fun: \"" << logData._func << '"' << std::endl;
      ++nCounter;
   }
}

std::string Asdf() noexcept
try
{
   throw 1;
   return "ASDF";
}
catch(...)
{
   struct LogData
   {
       const std::string_view _file = __FILE__;
       const unsigned int     _line = __LINE__;
       const std::string_view _func = __func__; // warning: predefined identifier is only valid inside function
   };
   LogErr<100, LogData>("Test.");
   return {};
}

вроде работает...
И каждый день — без права на ошибку...
Re: __func__ в локальной структуре
От: watchmaker  
Дата: 23.08.22 15:30
Оценка:
Здравствуйте, B0FEE664, Вы писали:



BFE>вроде работает...

Под "вроде работает" подразумевается то, что код компилируется (хоть и с предупреждениями) в gcc,clang,msvc? А то что он выводит три принципиально разных ответа не смущает?



BFE>Это валидный код или же предупреждение по делу и так нельзя?:

Думаю, всё же scope не тот.

Для лямбд, например, отдельно поведение __func__ патчили.
Хочешь тут специфицировать, что в таком коде наоборот делался подъём вверх до поиска scope, в котором есть __func__? Ну какая-то логика тут есть, да...
Re[2]: __func__ в локальной структуре
От: B0FEE664  
Дата: 23.08.22 16:50
Оценка:
Здравствуйте, watchmaker, Вы писали:

BFE>>вроде работает...

W>Под "вроде работает" подразумевается то, что код компилируется (хоть и с предупреждениями) в gcc,clang,msvc? А то что он выводит три принципиально разных ответа не смущает?

Я под gcc проверил, он работает так, как я ожидал и без предупреждений. Предупреждение получил от QtCreator'а и не понял, что не так.

BFE>>Это валидный код или же предупреждение по делу и так нельзя?:

W>Думаю, всё же scope не тот.
А что не так? По отношению к структуре это внешняя static константа:
static const char __func__[] = "function-name ";

Если я правильно понимаю, __func__ можно возвращать (копию) из метода локального класса:
см. h() и m() из примера в стандарте:

int x;
void f() {
static int s;
int x;
const int N = 5;
extern int q();
int arr[2];
auto [y, z] = arr;
struct local {
int g() { return x; } // error: odr-use of non-odr-usable variable x
int h() { return s; } // OK
int k() { return ::x; } // OK
int l() { return q(); } // OK
int m() { return N; } // OK: not an odr-use
int* n() { return &N; } // error: odr-use of non-odr-usable variable N
int p() { return y; } // error: odr-use of non-odr-usable structured binding y
};
}
local* p = 0; // error: local not in scope


Так что исходя из общих соображений — всё корректно, но может я чего упускаю из виду... Инициализацию, например... Ладно, переделаю завтра на метод, посмотрю, что получится.

W>Для лямбд, например, отдельно поведение __func__ патчили.

W>Хочешь тут специфицировать, что в таком коде наоборот делался подъём вверх до поиска scope, в котором есть __func__? Ну какая-то логика тут есть, да...

Хмм... Разночтение при инициализации... _func = __func__? Ну может быть... Или нет?
Вот если взять обычный класс:

static const int N = 1;
struct A
{
  const int m = N;
};

void f()
{
  static const int N = 2;  
  A a;
  std::cout << a.m; 
}


Было бы удивительно увидеть в выводе 2. нет?
И каждый день — без права на ошибку...
Re[2]: __func__ в локальной структуре
От: σ  
Дата: 23.08.22 16:57
Оценка:
BFE>>Это валидный код или же предупреждение по делу и так нельзя?:
W>Думаю, всё же scope не тот.
Чем же?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.