免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4465 | 回复: 10
打印 上一主题 下一主题

[C] sizeof 必须找到类型定义,两个.c一起编译为啥找不到? [复制链接]

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2016-04-23 14:25:46操作系统版块每日发帖之星
日期:2016-05-09 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-28 11:16 |只看该作者 |倒序浏览
本帖最后由 jeasun 于 2012-11-28 11:18 编辑

linux:/home/test # cat ttextern.c
#include <stdio.h>
#include <stdlib.h>

char *aa[] = {"123", "qwe", "asd"};

int strput(char *a)
{
        puts(a);

        return 0;
}

linux:/home/test # cat ttexternmain.c
#include <stdio.h>
#include <stdlib.h>

extern char *aa[];

int main()
{
        printf("%d\n", sizeof(aa));
}

linux:/home/test # gcc ttextern.c ttexternmain.c
ttexternmain.c: In function ‘main’:
ttexternmain.c:8: error: invalid application of ‘sizeof’ to incomplete type ‘char *[]’
linux:/home/test #

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2016-04-23 14:25:46操作系统版块每日发帖之星
日期:2016-05-09 06:20:00
2 [报告]
发表于 2012-11-28 11:27 |只看该作者
定义和声明改成char *aa[3];定长的,告警可以消除,请教各位大神,动态的怎么搞?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2012-11-28 11:51 |只看该作者
听不懂,什么叫“动态的”?

另外,
int strput(char *a)
{
        puts(a);

        return 0;
}
和你的问题有什么干系

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2012-11-28 12:01 |只看该作者
标题中“两个.c一起编译为啥找不到? ”
------ 两个.c怎么一起编译?我从来没听说过。编译都是单文件的

论坛徽章:
0
5 [报告]
发表于 2012-11-28 13:39 |只看该作者
首先这就不是警告,警告是虽然不太正确但学是可以编过去,你这根本就是错误。你的声明的信息不完全,只告诉了aa是个char型指针的数组,并没有说明长度,编译器自然不知道他的长度了。像周大所说的,编译的时候都是分别编译的,编译器不会去上别的文件里去给你找数组长度的。

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2016-04-23 14:25:46操作系统版块每日发帖之星
日期:2016-05-09 06:20:00
6 [报告]
发表于 2012-11-28 15:24 |只看该作者
回复 3# bruceteen
测试代码,抱歉。。。

   

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2016-04-23 14:25:46操作系统版块每日发帖之星
日期:2016-05-09 06:20:00
7 [报告]
发表于 2012-11-28 15:26 |只看该作者
回复 5# liwangli1983

恩 是错误,就是想定义个
char *aa[] = {"123", "qwe", "asd"};
不指定数组长度,添加元素的时候只管添加就行的。

看来这种数组是不支持sizeof的。。。


   

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2016-04-23 14:25:46操作系统版块每日发帖之星
日期:2016-05-09 06:20:00
8 [报告]
发表于 2012-11-28 15:29 |只看该作者
回复 4# bruceteen
你的意思是两个.c,每次编译时只编译成.o,链接时才ld成一个可执行的程序吧。又没说清楚。。 多多包涵。。

   

论坛徽章:
0
9 [报告]
发表于 2012-11-28 15:39 |只看该作者
jeasun 发表于 2012-11-28 15:26
回复 5# liwangli1983

恩 是错误,就是想定义个


在同一文件中使用sizeof当然是没问题的,编译器编译时看一下定义的位置就知道它的长度了。但在另一个文件里声明时不指明长度还想sizeof当然是不行的,编译器在这个文件中找不到其定义位置,也不会去别的文件找,所以无法获取长度信息。

论坛徽章:
0
10 [报告]
发表于 2012-11-28 18:43 |只看该作者
要理解 sizeof 不是一个函数,而是一个被编译器理解的关键字,不是在链接(linking)时而是在编译(compiling)时,指示编译器按类型替换成尺寸数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP