英文:
Is GCC being lenient with the use of an incomplete file?
问题
I have a file main.c
, which contains the following line of code:
struct args packed;
struct args
is defined in another file named dct.c
. However, that file is not included. They are passed to the compiler as gcc -Wall main.c dct.c ...
.
Shouldn't the compiler emit a warning about an incomplete type?
Note that struct args
is being instantiated, and its members are accessed within main.c
.
I only noticed this because of the linter
warning me about an incomplete type, however GCC
seems fine with it.
What am I missing? Because as I suspected, and according to this answer, they are indeed different translation units, and GCC can't see the definition in the second file.
英文:
I have a file main.c
, which contains the following line of code:
struct args packed;
the struct args
is defined in another file named dct.c
. However that file is not included. They are passed to the compiler as gcc -Wall main.c dct.c ...
Shouldn't the compiler emit a warning about an incomplete type?
Note that struct args
is being instantiated and its members are accessed within main.c
.
I only noticed this because of the linter
warning me about an incomplete type, however GCC
seems fine with it.
What am I missing? Because as I suspected, and according to this answer they are indeed different translation units and GCC can't see the definition in the second file.
答案1
得分: 2
I will only translate the non-code parts of your text:
"Are you sure the struct isn't declared in a header file that your main.c includes? Are you using some IDE that is doing magic for you?"
如果该结构体没有在主文件 main.c 包含的头文件中声明,您确定吗?您是否使用了某个为您执行魔法的集成开发环境(IDE)?
"If I simply define a struct in one file and try to use it in the other it doesn't work as you describe:"
如果我仅在一个文件中定义结构体,然后尝试在另一个文件中使用它,它不会按您描述的方式工作:
英文:
Are you sure the struct isn't declared in a header file that your main.c includes? Are you using some IDE that is doing magic for you?
If I simply define a struct in one file and try to use it in the other it doesn't work as you describe:
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;
| ^~~~~~
This works:
$ 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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论