C: Предупреждение о видимости структуры

0

У меня сложный проект С. В файле 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);

Может кто-нибудь мне помочь?

  • 3
    Что и где находится строка castfunctions.h:36 ?
  • 2
    Вы поместили #include в тело функции по ошибке?
Показать ещё 9 комментариев
Теги:
clang
gcc

2 ответа

5

объявление "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

1

В дополнение к ответу nos вы должны запустить gcc с -E вместо -c. Это выведет предварительно обработанную единицу перевода, чтобы вы могли видеть, что видит компилятор. На выходе также упоминается каждый файл, который входит в комплект.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню