Ошибка: C2016 C требует, чтобы структура или объединение имели хотя бы одного члена - PullRequest
0 голосов
/ 08 января 2019

Я новичок в c / c ++ и столкнулся с проблемой использования некоторых c заголовков проекта в c++.

У меня есть два решения, где #one содержит в основном c файлы (также несколько cpp) и #two только cpp файлы. каждое решение компилируется и работает правильно, без ошибок. оба находятся на VisualStudio v.15.9.4 VC++ 2017 с таргетингом windows SDK 10.0.17134.0.

Я скопировал и вставил некоторые заголовочные файлы из #one в #two и при компиляции получил ошибку в заголовке.

typedef struct
{
    U32 RESERVED;
    SHARED_TYPE *  SHARED;
    struct
    {
    } ALIEN; <--- HERE
} TxRequest;

Error   C2016   C requires that a struct or union has at least one member 
Error (active)  E0169   expected a declaration

поиск ответов в основном где-то о разнице компиляторов, но нацелены на один и тот же SDK, где не оба решения используют один и тот же компилятор? почему в одном решении он компилируется без ошибок, а в одном с ошибкой?

как мне исправить это, имея такую ​​же пустую структуру. как изменение может повлиять на другие части.

1 Ответ

0 голосов
/ 08 января 2019

Стандарт C не допускает пустых структур, как подсказывает сообщение об ошибке. Стандартный C ++ допускает их, поскольку они могут быть полезны в качестве мета-значений шаблонов и для разрешения перегрузки, среди других целей.

Из сообщения об ошибке кажется, что вы компилируете этот заголовок с помощью компилятора Visual Studio C.

Другие компиляторы более снисходительны. Пустые C-структуры являются давним расширением GCC и часто использовались, как в этом примере, как другая форма так называемой "struct hack" . В своей классической форме взлом структуры состоял в том, чтобы поместить массив длины 1 (или, используя gcc, длину 0) в качестве заполнителя для расширения переменной длины. В этом случае расширение переменной длины предположительно является единственным объектом неопределенного типа, в отличие от классического взлома структуры, где это массив объектов указанного типа, но неопределенной длины.

Таким образом, GCC (и Clang) принимают эту декларацию struct как действительную C, если только вы не запрашиваете строгую проверку с помощью -pedantic (и даже тогда она отображается как предупреждение, а не ошибка).

В общем, union было бы лучшим решением здесь. Но для этого необходимо знать различные возможные расширения TxRequest, поэтому может возникнуть больше проблем, чем оно того стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...