GCC对使用不完整的文件是否很宽容?[关闭]

qybjjes1  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(94)

**关闭。**此题需要debugging details。目前不接受答复。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
3天前关闭。
Improve this question
我有一个文件main.c,其中包含以下代码行:

struct args packed;

struct args在另一个名为dct.c的文件中定义。但该文件不包括在内。它们作为gcc -Wall main.c dct.c ...传递给编译器
编译器不应该发出关于不完整类型的警告吗?
请注意,struct args***正在被示例化,其成员在main.c中访问。
我之所以注意到这一点,是因为linter警告我类型不完整,但GCC似乎对此没有问题。
我错过了什么?因为正如我所怀疑的,根据this answer,它们确实是不同的翻译单元,GCC无法看到第二个文件中的定义。

j91ykkif

j91ykkif1#

你确定这个结构体没有在你的main. c包含的头文件中声明吗?您是否正在使用某个为您提供魔法的IDE?
如果我只是在一个文件中定义一个结构体,并尝试在另一个文件中使用它,它不会像你描述的那样工作:

gcc version 12.2.1 20230201 (GCC) 

$ gcc main.c args.c 
main.c: In function ‘main’:
main.c:5:15: error: storage size of ‘packed’ isn’t known
    5 |   struct args packed;
      |               ^~~~~~

这是可行的:

$ cat args.h 
#ifndef _ARGS_H_
#define _ARGS_H_
struct args {
  int val;
};
#endif //_ARGS_H

$ cat args.c 
#include <stdlib.h>
#include "args.h"

struct args *makearg(int val) {
  struct args *ret = malloc(sizeof(struct args));
  ret->val = val;
  return ret;
}

$ cat main.c 
#include <stdio.h>
#include <stdlib.h>
#include "args.h"

extern struct args *makearg(int val);

int main(int argc,char **argv) {
  struct args *packed = makearg(3);
  printf("%d\n",packed->val);
  free(packed);
  return 0;
}

$ gcc main.c args.c 
$ ./a.out 
3

相关问题