C :有关结构可见性的警告
C : Warning about visibility of a struct
我有一个复杂的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 Message
与struct message
除了 nos 的答案之外,您还应该使用 -E
选项而不是 -c
运行 gcc。这将输出预处理的翻译单元,因此您可以看到编译器真正看到的内容。输出还提到了包含的每个文件。
相关文章:
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 放松的订单和线程间可见性
- GCC 6.x警告有关Lambda可见性
- C++ 中的Shared_ptr和内存可见性
- 静态库中的符号可见性和操作
- 未直接继承的基模板类成员的可见性
- C :有关结构可见性的警告
- 如何在覆盖具有错误可见性的虚拟方法时得到警告