Это валидный код или же предупреждение по делу и так нельзя?:
| Скрытый текст |
| 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 {};
}
вроде работает...
Здравствуйте, B0FEE664, Вы писали:
BFE>вроде работает...
Под "вроде работает" подразумевается то, что код компилируется (хоть и с предупреждениями) в gcc,clang,msvc? А то что он выводит три принципиально разных ответа не смущает?
BFE>Это валидный код или же предупреждение по делу и так нельзя?:
Думаю, всё же scope не тот.
Для лямбд, например, отдельно поведение
__func__ патчили.
Хочешь тут специфицировать, что в таком коде наоборот делался подъём вверх до поиска scope, в котором есть
__func__? Ну какая-то логика тут есть, да...
Здравствуйте, 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. нет?