Допустима ли эта инициализация C ?

#c #visual-c

#c #visual-c

Вопрос:

Это написал другой разработчик, и мне это кажется странным. Она выполняется по адресу: http://codepad.org/jhnFpzGa

Но я обеспокоен, потому что это выдает предупреждение о невозможности создать конструктор по умолчанию в MSVC 10 (очевидно, из-за ссылки). Тем не менее, это работает и на MSVC. Предупреждение не исчезнет, если я сделаю его const UsageInfoamp; либо.

 typedef const char* UsageInfo[2];
UsageInfo usage_1 = {"foo1", "bar1"};
UsageInfo usage_2 = {"foo2", "bar2"};

struct JumpTableEntry
{
    const char* command;
    UsageInfoamp; usage; // {const char *usage,const char amp;details}
};

JumpTableEntry jumpTable_[] =
{
    {"1", usage_1},
    {"2", usage_2}
};

int main()
{
    cout << jumpTable_[0].usage[1] << endl;
    return 0;
}
  

Комментарии:

1. Какая строка вас смущает?

2. На мой взгляд, код выглядит безопасным. Предупреждение MSVC выглядит чрезмерно усердным. На их веб-сайте указано на это предупреждение «Вы не сможете создавать объекты этого типа.», что явно неверно. На C 11 попробуйте добавить JumpTableEntry() = delete; в класс.

3. @Cyber Вопрос не об одной единственной строке?

4. Я полагаю, что этот код выдаст такое же предупреждение, и людям было бы проще его использовать: gist.github.com/sharth/9d36559566bb4fa26659

5. @Neil: отправьте сообщение в качестве ответа, и я могу его принять. Другими словами, единственный способ избежать предупреждения с помощью такого кода — использовать флаг / Wd? Этот код плохо оформлен?

Ответ №1:

Предупреждение кажется действительным. Она не может быть сконструирована по умолчанию. Если вы хотите, чтобы предупреждение исчезло, я бы предложил одно из следующих действий:

  • Объявите конструктор по умолчанию, который является закрытым, который делает что-то законное, что не выдает предупреждений, но в конечном итоге не может быть достигнуто.
  • Явно удалите конструктор по умолчанию, JumpTableEntry() = delete хотя это не поддерживается до VS2013 — ссылка

Возможно, вас немного смущает, почему это запрос / предупреждение для конструктора, потому что вы использовали слово struct . Помните, что в C struct s и class es обычно не отличаются друг от друга, если вы не сделаете их такими, за исключением того, что элементы по умолчанию public в struct s и по умолчанию private в class es.

Комментарии:

1. Первый не работает, потому что он предотвращает инициализацию массива в стиле C.

2. И предупреждение неверно, потому что тип является агрегированным, поэтому инициализация aggregate может использоваться для создания экземпляров, как в его примере кода.