C :有关结构可见性的警告

C : Warning about visibility of a struct

本文关键字:可见性 警告 结构      更新时间:2023-10-16

我有一个复杂的C项目。在我声明此结构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,因此它充当无用的向前声明。

这意味着您显示

的代码不是完整的事实,您的文件中的内容比您显示的内容要多得多 - 错误在于未向我们显示的代码。

以下是您可能会收到警告的几个原因;

  • #include <message.h>包含的文件与您认为的文件完全不同,请去其他地方查找另一个消息.h。

  • 你在邮件中包含了守卫。

#ifndef MESSAGE_H
#define MESSAGE_H 
struct message { 
....
};
#endif`

然后,在源文件中使用头文件,如下所示:

   #include <thisnthat.h>
   #include <message.h>

碰巧的是,<thisnthat.h>文件还定义了
MESSAGE_H宏,使整个消息不可见。或者,thisnthat.h标头具有#define message something_else

  • 与 message.h 一起直接或间接包含的头文件中的某处存在语法错误。去寻找失踪的人;或 { 或 }

  • 你拼错了什么。您的评论指出,当您执行typedef struct Message时错误已消失,由于某种原因,该Message大写M。所以你在某个地方混淆了struct Messagestruct message

除了 nos 的答案之外,您还应该使用 -E 选项而不是 -c 运行 gcc。这将输出预处理的翻译单元,因此您可以看到编译器真正看到的内容。输出还提到了包含的每个文件。