В этом коде у меня есть две форвардные объявления: массив bool
массив QString
в namesace NLog
.
bool
работает. QString
создает ошибку сегментации.
Заголовок:
class Log : public QObject
{
explicit Log();
public:
enum Facility
{
third_party_fac,
test_fac,
__facility_last_element
};
enum Severity
{
debug_sev,
warning_sev,
critical_sev,
fatal_sev,
__severity_last_element
};
};
namespace NLog
{
extern bool logging_enabled[Log::__facility_last_element][Log::__severity_last_element];
extern QString severity_name[Log::__severity_last_element];
};
class LogStaticInitiallizer
{
public:
LogStaticInitiallizer();
};
static LogStaticInitiallizer initiallizer=LogStaticInitiallizer();
Источник:
QString NLog::severity_name[Log::__severity_last_element];
bool NLog::logging_enabled[Log::__facility_last_element][Log::__severity_last_element];
using NLog::logging_enabled;
using NLog::severity_name;
LogStaticInitiallizer::LogStaticInitiallizer()
{
qDebug()<<"0";
qDebug()<<logging_enabled[0][0];
qDebug()<<severity_name[0];
qDebug()<<"1";
}
он производит
0
ложный
и сбои на трассе QString
Как сказал Петр С., проблема заключается в том, что конструктор LogStaticInitiallizer
вызывается перед его инициализацией в исходном файле.
Кроме того, существует основная проблема с зарезервированными идентификаторами, начинающимися с __
. См. Каковы правила использования подчеркивания в идентификаторе C++?
__facility_last_element
и другие, начинающиеся с__
являются зарезервированными идентификаторами