#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 может использоваться для создания экземпляров, как в его примере кода.