本人现在手里有三个文件,如下
// a.h extern const float model[];
// tables.cpp const float model[]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// process.cpp #include "a.h" static void iNormalizeData(int max_idx) { assert( max_idx == sizeof(model) / sizeof(model[0]) ); }
三个文件放在一起编译,编译报错
错误信息如下
const float []: 非法的sizeof操作数
猜测原因是,编译的时候,process.cpp不知道model里整个数组所占的空间大小。
问一下各位,该错误怎么样改进,能实现数组大小校对的功能
解决方案
5
编译期的话,写上大小就行了,运行期的话,(tables.cpp里)用一个函数返回大小,编译器会优化的
20
sizeof 的计算发生在代码编译 的时刻。
extern 标注的符号 在链接的时刻解析。
所以 sizeof 不知道 这个符号到底占用了多少空间。
原因在于没有声明长度的数组是个不完整类型。
匿名长度的数组声明在有初始化值定义时会有编译器根据初始化列表确定其长度。但是对与extern文件外部的数组,只有链接时才能确定其大小(同一文件的extern本人等会测试),但sizeof运算符需要在编译时就确定对象的大小,于是错误就出现了。
解决办法就是声明的时候给它个长度。
extern 标注的符号 在链接的时刻解析。
所以 sizeof 不知道 这个符号到底占用了多少空间。
原因在于没有声明长度的数组是个不完整类型。
匿名长度的数组声明在有初始化值定义时会有编译器根据初始化列表确定其长度。但是对与extern文件外部的数组,只有链接时才能确定其大小(同一文件的extern本人等会测试),但sizeof运算符需要在编译时就确定对象的大小,于是错误就出现了。
解决办法就是声明的时候给它个长度。
5
The sizeof operator shall not be applied to an expression that has function type or an
incomplete type
incomplete type
5
incomplete type
5
题主其实可以直接把 include a.h 换成
#include "tables.cpp"
5
#include <iostream> using namespace std;} extern const float model[]; void SizeofAfterDeclare(){ //cout <<sizeof(model)<<endl; //报错 } const float model[]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; void SizeofAfterDefine(){ cout <<sizeof(model)<<endl; //没问题。 } int main(){ SizeofAfterDeclare(); SizeofAfterDefine(); return 0; }
C,C++ 文法,是上下文相关文法。
不是上下文无关文法。
1)
声明以后,不能知道数组大小,除非直接标明大小
2)
定义以后,可以准确知道数组的大小
–用常量表达式定义的,
或用初始化表定义,编译器点数的–
5
不同实现文件中,声明相同名字的数组,大小可以不一致
各个实现文件中,该数组,是同一个,数组,
不过可以得到本文件的声明的数组大小。
各个实现文件中,该数组,是同一个,数组,
不过可以得到本文件的声明的数组大小。