为什么我收到警告C4034:sizeof返回0?

时间:2015-10-31 09:35:45

标签: c

我有一个包含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.我做错了什么以及如何解决?

2 个答案:

答案 0 :(得分:4)

原因是,给出了声明

extern struct NUMBERS Hello[];

编译器无法看到struct NUMBERSHello中的元素数量。

您需要在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);