предупреждение "параметр имеет неполный тип" - PullRequest
7 голосов
/ 13 мая 2011

У меня есть это в C-файле:

struct T
{
    int foo;
};

C-файл содержит файл включения в h со следующими строками:

typedef struct T T;
void listInsertFirst(T data, int key, LinkedList* ListToInsertTo);

функция listInsertFirst являетсяодин я получаю предупреждение.Как я могу это исправить?

Ответы [ 5 ]

2 голосов
/ 14 мая 2011

Как мы выяснили в комментариях, проблема заключалась в том, что определение struct T произошло после определения T в заголовке. У тебя действительно есть вещи назад. Заголовок должен определять все типы и прототипы функций, и ваши файлы C должны их использовать.

Вместо этого вы хотите изменить сигнатуру вашей функции вставки, чтобы получить указатель на ваши данные и размер данных. Затем вы можете выделить немного памяти для данных, скопировать и сохранить их. Вам не нужен конкретный тип, просто объявите его void *.

void listInsertFirst(void *data, size_t data_size, int key, LinkedList* ListToInsertTo);

Тогда вызывающий абонент сделает что-то вроде этого:

struct T { int foo; };
struct T x = { ... };
int someKey = ...;
LinkedList *someList = ...;
listInsertFirst(&x, sizeof x, someKey, someList);
2 голосов
/ 13 мая 2011

Когда вы включаете заголовочный файл, компилятор знает, что T является структурой неизвестного размера и что listInsertFirst хочет получить ее в качестве первого аргумента.Но компилятор не может организовать вызов listInsertFirst, поскольку он не знает, сколько байтов нужно поместить в стек для параметра T data, размер T известен только внутри файла, в котором определен listInsertFirst.

Лучшим решением было бы изменить listInsertFirst на T* в качестве первого аргумента, чтобы ваш заголовочный файл сказал:

extern void listInsertFirst(T *data, int key, LinkedList* ListToInsertTo);

Тогда вы получите непрозрачный указательдля вашего T типа данных и, поскольку все указатели имеют одинаковый размер (по крайней мере, в современном мире), компилятор будет знать, как построить стек при вызове listInsertFirst.

0 голосов
/ 14 января 2016
  1. Определить struct T в заголовке, а не в файле .c;
  2. Выберите разные имена для структуры и typedef.
0 голосов
/ 13 мая 2011

Попробуйте переместить определение структуры в файл h, прежде чем ввести typedef.

0 голосов
/ 13 мая 2011

Вы уверены, что это первый параметр, который является проблемой? Чтобы быть уверенным, попробуйте временно изменить тип параметра с T на int. Скорее всего, третий параметр на самом деле является проблемой.

Многие компиляторы не очень хорошо указывают на проблему такого рода проблем.

...