警告:“ ...”的声明在此功能之外不可见[-Wvisibility]

时间:2018-08-23 12:21:11

标签: c

首先,我已经搜索了错误并阅读了以下答案:

但是他们都没有帮助我,所以我们来了。

问题出在这两个结构之间的某个地方,prx_data_s存储通用数据,而prx_ops_s定义指向将使用该数据的函数的指针。

我将简化示例的来源:

prx_data.h

#ifndef PRX_EXAMPLE_DATA_H
#define PRX_EXAMPLE_DATA_H

#include "prx_ops.h"

struct prx_data_s {
    enum  prx_op_t op;
    char *keyquery;
};

char *get_query(struct prx_data_s *dt);

#endif

prx_data.c

#include "prx_data.h"

char *get_query(struct prx_data_s *dt)
{
    return dt->keyquery;
}

prx_ops.h

#ifndef PRX_EXAMPLE_OPS_H
#define PRX_EXAMPLE_OPS_H

#include "prx_data.h"

enum prx_op_t {
    PRX_EXAMPLE_OP = 2
};

struct prx_ops_s {
    int (*dec) (struct prx_data_s *);
};

#endif

我正在尝试使用以下示例编译对象:

clang -c prx_data.c -o prx_data.o -std=c11 -g -Wall

这是输出错误:

In file included from prx_data.c:1:
In file included from ./prx_data.h:4:
./prx_ops.h:11:24: warning: declaration of 'struct prx_data_s' will not be visible outside of this function [-Wvisibility]
int (*dec) (struct prx_data_s *);
                   ^

欢迎所有帮助,谢谢:)

2 个答案:

答案 0 :(得分:4)

您的标头中存在循环依赖项问题

prx_data.h:

#include "prx_ops.h" <<< Here we do not yet see the struct definition

    prx_ops.h:

    #include "prx_data.h"  <<<< Nothing will be included due to inclusion guards.

    struct prx_ops_s {
       int (*dec) (struct prx_data_s *);  <<<< Here a new struct type is declared.
    };

later back in prx_data.h:

struct prx_data_s {
  enum  prx_op_t op;
  char *keyquery;
};

答案 1 :(得分:2)

在读取prx_ops.h时,您没有包含prx_data.h,因为编译器正在从prx_ops.h开头的包含中读取prx_data.h。因此,您必须向前声明它。

尝试添加

struct prx_data_s;

在prx_ops.h的开头

希望有帮助~~