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

时间:2013-11-15 17:45:55

标签: c++ c gcc clang

我有一个复杂的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);

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:6)

  

'struct message'的声明在此之外是不可见的   功能[-Wvisibility]

该警告意味着此时未声明struct message,因此它作为无用的前方声明。

这意味着您展示的代码并非完全正确,您的文件中包含的内容与您显示的内容相比更多 - 错误在代码中未显示给我们。

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

  • #include <message.h>包含一个与您的想法完全不同的文件,请在其他位置查找另一个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标头有#define message something_else

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

  • 你拼错了一些东西。您的评论指出,当您执行typedef struct Message时,由于某种原因Message的资本为M,错误消失了。所以在某个地方你混淆了struct Messagestruct message

答案 1 :(得分:1)

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