У меня сложный проект С. В файле message.h
я объявляю эту структуру
struct message
{
int err;
struct header
{
char *protocol_version;
char *type;
long int sequence_number;
} header;
struct body
{
int num_tag;
char *tag_labels[LEN];
int num_attr_tag[LEN];
char *attr_labels[LEN][LEN];
char *attr_values[LEN][LEN];
char *attr_types[LEN][LEN];
} body;
};
В файле "castfunctions.h" я включаю файл "message.h" и объявляю функцию "setClientNat",
#include <message.h>
void *setClientNat(struct message *msg);
Когда я компилирую, у меня есть это предупреждение
castfunctions.h:warning:
declaration of 'struct message' will not be visible outside of this function [-Wvisibility]
void *setClientNat(struct message *msg);
Может кто-нибудь мне помочь?
объявление "struct message" не будет отображаться вне этой функции [-Wvisibility]
Это предупреждение означает, что struct message
не было объявлено в этот момент, поэтому оно служит бесполезным форвардным объявлением.
Это означает, что код, который вы показываете, не является полной правдой, ваши файлы имеют намного больше в них, что вы показываете - ошибка в коде, который нам не показан.
Вот несколько причин, почему вы можете получить предупреждение;
#include <message.h>
включает в себя файл, который отличается от того, что вы думаете, и искать другой message.h в другом месте.
У вас есть охранники в вашем сообщении. Так вот
#ifndef MESSAGE_H #define MESSAGE_H struct message { .... }; #endif'
Затем вы используете заголовочные файлы в исходном файле следующим образом:
#include <thisnthat.h>
#include <message.h>
И так получилось, что файл <thisnthat.h>
также определил
MESSAGE_H, делая все message.h невидимым. В качестве thisnthat.h
заголовок thisnthat.h
имеет #define message something_else
Там синтаксическая ошибка где-то в файлах заголовков, прямо или косвенно включаемых вместе с message.h. Идите на поиски пропавших без вести; или или }
Вы что-то напутали. В вашем комментарии указано, что ошибка исчезла, когда вы сделали сообщение типа typedef struct Message
которое по какой-то причине имеет Message
с капиталом M
Итак, где-то вы смешиваете struct Message
vs struct message
В дополнение к ответу nos вы должны запустить gcc с -E
вместо -c
. Это выведет предварительно обработанную единицу перевода, чтобы вы могли видеть, что видит компилятор. На выходе также упоминается каждый файл, который входит в комплект.
castfunctions.h:36
?#include
в тело функции по ошибке?