【问题标题】:c compiler warning: 'struct x' declared inside parameter listc编译器警告:在参数列表中声明'struct x'
【发布时间】:2015-12-04 06:52:22
【问题描述】:

之前有人问过这个问题,但似乎没有一个解决方案适用于我的代码。这是我的主文件server.c

#include <stdlib.h>
#include <unistd.h>
#include "message.h"

int main(int argc, char *argv[]) {
    // do stuff
    return 0;
}

这是我包含的文件message.c

#include <stdlib.h>
#include <unistd.h>

struct message_t {
    int field1;
    int field2;
};

int sendMessage(struct message_t *message) {
    // do stuff
    return 0;
}

我还有一个头文件message.h:

#include <stdlib.h>
#include <unistd.h>

struct message_t {
    int field1;
    int field2;
};

int sendMessage(struct message_t *message);

当我编译 server.c 和 message.c 时,我在声明 sendMessage 的行中收到 message.c 的警告: 警告:在参数列表中声明了“struct message_t” 警告:它的作用域只是这个定义或声明,可能不是你想要的

“在参数列表中声明”是什么意思?它所指的参数列表是什么?

【问题讨论】:

  • 对于哪个文件和哪一行收到警告?为什么在 message.c 中定义 struct message_t ?您应该包含 message.h。
  • ... 哪一行?编辑您的问题,不要发布 cmets。-
  • 从除message.h 之外的所有文件中删除声明struct message_t { int field1; int field2; };。并在您的 .c 文件中包含 message.h。然后它应该编译。
  • 你发布的代码server.c应该抱怨struct message_t的重新定义你确定这段代码正是你正在编译吗?
  • 您发布的代码不会生成此警告。仅当您从 message.c 中删除声明时才会这样做(问题已解释 here )。请编辑您的问题以减少混乱,我将删除我的反对票。

标签: c struct


【解决方案1】:

您在三个地方定义message_t,而您应该只在message.h 中定义它。此外,message.c 应包含 message.h。

【讨论】:

  • 这不会产生影响(#include 是纯文本替换),除非“真实代码”与 OP 发布的不完全相同
  • @M.M 但最好这样做,因为它允许在编译时检测到更多错误。
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 2015-08-19
  • 2021-06-29
  • 2021-01-14
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多