Предварительное объявление массива QStrings приводит к ошибке сегментации

0

В этом коде у меня есть две форвардные объявления: массив 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

  • 1
    __facility_last_element и другие, начинающиеся с __ являются зарезервированными идентификаторами
  • 1
    это может быть статический порядок инициализации Fiasco ?
Показать ещё 5 комментариев
Теги:
arrays
qt
forward-declaration
qstring

1 ответ

0
Лучший ответ

Как сказал Петр С., проблема заключается в том, что конструктор LogStaticInitiallizer вызывается перед его инициализацией в исходном файле.

Кроме того, существует основная проблема с зарезервированными идентификаторами, начинающимися с __. См. Каковы правила использования подчеркивания в идентификаторе C++?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню