注册 登录
编程论坛 C++教室

为什么数组长度不可统计?

vfdff 发布于 2010-07-10 00:58, 1625 次点击
程序代码:
// test.cpp
#include "test.h"
const char test[] = "This is a test file\n";
// test.h
extern const char test[];
// main.cpp
#include <stdio.h>
#include "test.h"
int main(int argc, char **argv)
{
    printf("%s, %d\n", test, sizeof(test));
    return 0;
}
为什么这样的程序会出现语法错误?提示 sizeof(test)操作非法呢?
VC具体编译错误信息:
d:\program_files\microsoft visual studio\myprojects\test\bcd.cpp(41) : error C2070: illegal sizeof operand



[ 本帖最后由 vfdff 于 2010-7-10 20:14 编辑 ]
9 回复
#2
flyingcloude2010-07-10 10:20
因为sizeof是在编译器的时候就完成的,而const char test[]还没有被初始化。
可以使用strlen替代sizeof。
#3
vfdff2010-07-10 20:15
test.h中指明的 extern 说明是引用别的文件中定义,难道它就不去查找吗?
#4
东海一鱼2010-07-10 21:48
extern 可以获得其他编译模块中的符号名和声明类型长度,但是无法获得x[]这样动态的对象大小。
#5
vfdff2010-07-13 23:09
回复 4楼 东海一鱼
x[]是数组,不算动态的呀?!


[ 本帖最后由 vfdff 于 2010-7-16 21:00 编辑 ]
#6
ToBeOOP2010-07-16 13:17
test数组在编译时,长度为定呢...
#7
vfdff2010-07-17 00:55
回复 6楼 ToBeOOP
就是,所以现在sizeof不能得到数组长度值才比较奇怪!
#8
东海一鱼2010-07-17 08:45
// test.cpp
#include "test.h"
const char test[] = "This is a test file\n";
// test.h
extern const char test[];
// main.cpp
#include test.h

以上是你的代码依赖关系。
test.h声明extern const char test[];这是个动态数组符号,未知大小。
test.cpp包含了test.h,看到了extern const char test[];但自身定义了const char test[] = "This is a test file\n"; OK,符号、大小明确,可以正确编译。
main.cpp包含了test.h,只看到符号,未知大小。无法用sizeof获得大小。

编译器编译的是CPP文件,而不是H文件。更不会去其他已编译的中模块‘查找’。查找模块中的符号,那是链接器的事情。编译器只会在自身及所包含的头文件中搜索声明的符号。







[ 本帖最后由 东海一鱼 于 2010-7-17 08:55 编辑 ]
#9
chenbjin2011-12-31 02:05
顺路请教!怎么构造函数来判断数组的长度(就下面这个函数头) (PS:sizeof,strlen,.size().length()这些我懂,就是在不知道数组的输入情况下,如何用函数来判断它的长度)
int length(int list[])
{
···
}
求赐教!
#10
vfdff2012-07-31 23:24
以下是引用东海一鱼在2010-7-17 08:45:45的发言:

// test.cpp
#include "test.h"
const char test[] = "This is a test file\n";
// test.h
extern const char test[];
// main.cpp
#include test.h

以上是你的代码依赖关系。
test.h声明extern const char test[];这是个动态数组符号,未知大小。
test.cpp包含了test.h,看到了extern const char test[];但自身定义了const char test[] = "This is a test file\n"; OK,符号、大小明确,可以正确编译。
main.cpp包含了test.h,只看到符号,未知大小。无法用sizeof获得大小。

编译器编译的是CPP文件,而不是H文件。更不会去其他已编译的中模块‘查找’。查找模块中的符号,那是链接器的事情。编译器只会在自身及所包含的头文件中搜索声明的符号。
有理,多谢!
1