Обычно эта проблема возникает, когда вы не включаете необходимые заголовки в фактический файл заголовка, но они включаются перед заголовком в определенные блоки компиляции.
Т.е. у вас есть файл заголовка без необходимого #include
:
// parse.h
#ifndef PARSE_H
#define PARSE_H
struct parse_key
{
char *name;
unsigned int value;
}
static inline void key_init(struct parse_key * pk)
{
pk->name = NULL; // <-- you need it here
}
#endif // PARSE_H
И тогда у вас есть два модуля компиляции, но только один из них включает соответствующий заголовок:
// something.c
#include <stdlib.h>
#include "parse.h" // <-- preprocessor inserts this when NULL is already known
// something_else.c
#include "parse.h" // <-- but in this case, it will not compile
Единственное надежное решение - включить все необходимые заголовкив самом проблематичном заголовке.
Поскольку компилируются только файлы .c, ваш компилятор не будет заботиться о том, что отсутствуют пропуски включений в файлах .h, но в таких случаях в средах разработки, таких как Visual Studio или Eclipse, часто отображаются предупреждающие сообщения..
В качестве примечания:
struct parse_key {
char *name;
unsigned int value;
} keynames[] = {
{"KEY_RESERVED", 0},
{"KEY_ESC", 1},
{"KEY_1", 2},
{"KEY_2", 3},
...
{"KEY_MAX", 0x2ff},
{NULL, 0}
};
- это переменная, которая будет создана в каждом модуле компиляции, который включает файл заголовка.Это означает, что вы, вероятно, также получите ошибки компоновщика, говорящие о наличии дублирующихся переменных.