我有一个包含5个文件的简单c项目。
Data.h
#ifndef DATA_INCLUDED
#define DATA_INCLUDED
struct NUMBERS {
int a;
int b;
int c;
int d;
};
#endif
Data.c
#include "Data.h"
struct NUMBERS Hello[] = {
{11, 12, 13, 14},
{15, 16, 17, 18},
{19, 20, 21, 22},
{23, 24, 25, 26}
};
Info.h
#ifndef INFO_INCLUDED
#define INFO_INCLUDED
extern struct NUMBERS Hello[];
extern int SizeOfHello;
#endif
Info.c
#include "Data.h"
#include "Info.h"
int SizeOfHello = sizeof Hello/sizeof(struct NUMBERS);
MAIN.C
#include <stdio.h>
#include "Info.h"
int main()
{
printf("%d\r\n", SizeOfHello);
return 0;
}
我得到了
警告C4034:sizeof返回0
当我运行程序并printf()
输出时0.我做错了什么以及如何解决?
答案 0 :(得分:4)
原因是,给出了声明
extern struct NUMBERS Hello[];
编译器无法看到struct NUMBERS
或Hello
中的元素数量。
您需要在Data.c中初始化(并且最好定义)SizeOfHello
- 这两个值都是可见的。它也优于Data.c中的include
info.h,因此编译器有可能检测到声明和定义之间的任何不匹配。
答案 1 :(得分:2)
您必须将大小计算移动到实际定义数组的文件Data.c
:
#include "Data.h"
struct NUMBERS Hello[] = {
{11, 12, 13, 14},
{15, 16, 17, 18},
{19, 20, 21, 22},
{23, 24, 25, 26}
};
int SizeOfHello = sizeof Hello/sizeof(struct NUMBERS);
这样写得更可靠:
int SizeOfHello = sizeof(Hello) / sizeof(*Hello);