打印

我滴个神啊!这样子也可以?见38楼新进展

[复制链接]
楼主: XIANSir
手机看帖
扫描二维码
随时随地手机跟帖
21
XIANSir|  楼主 | 2011-3-17 19:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
20# singleywy
确实如此,今天又学到一点C的知识,很开心:)


谢谢指点!

使用特权

评论回复
22
XIANSir|  楼主 | 2011-3-17 19:48 | 只看该作者
21# singleywy
确实如此,我已经不不纠结了。谢谢指点。

不过我还是认为,Keil C51编译器可以做的更好一些:对于这种情况,其实可以不给出警告而是给出Message或Information,当然了如果不想看到这些内容,可以通过编译器设置选项关掉。

当然了,这只是我个人的想法,不影响Keil C51已经是很好的编译器这一事实!

使用特权

评论回复
23
ayb_ice| | 2011-3-17 20:26 | 只看该作者
XIANSir
人家符合标准的C规范,你却要它修改,要真是改了,只怕有意见的人更多
正所谓萝卜白菜,各有所爱...

使用特权

评论回复
24
XIANSir|  楼主 | 2011-3-17 20:53 | 只看该作者
本帖最后由 XIANSir 于 2011-3-17 22:49 编辑

24# ayb_ice 前辈,俺现在的主张是:
1、这种用法是符合C语言规范的
2、这种用法其实并不好,绝对不是好的编程实践原则,也不符合C语言的精神
3、我们要正视这个问题,并想办法解决这个问题,使大家避免这种不好的使用方法,来减少潜在错误的可能性
4、我们不能通过更改C语言规范的方法来解决上面的问题,保持C语言的兼容性是最重要的
5、编译器通过给出错误的方式来告知人们上面的问题是坚决不可取的,因为那违反了C语言规范。
6、编译器通过给出警告的方式来告知人们上面的问题是否可取存在争议,因为高手会因此产生反感,但对于C语言新手来说却并无任何问题——毕竟那只是警告而已
7、为了使大家都能接受,编译器可以通过发出Message或Information的方式来告知编程者上面的问题,并且Message是默认给出的,但是可以通过开关设置来关闭掉使得编译器不给出任何的Message和Information。

而且,我认为这种解决方法不仅仅对解决这个问题有效。C语言其实存在很多容易产生潜在编程错误的特性,对于这些特性都可以采用上面的方法来处理。

另外,我说明一下我认为的”C语言的精神“:就是充分发挥静态语言的优势,在编译期尽可能多的发现和排除程序中的错误及潜在错误。

对于C语言编写的程序,在编译期给出错误或警告提示总比程序运行后发现错误要好的多,毕竟C语言编写的程序都是系统程序和关键性任务程序。

使用特权

评论回复
25
highgear| | 2011-3-17 21:39 | 只看该作者
你不能责怪历史, 就像你现在不能责怪古籍的晦涩难懂一样, 因为早期没有现在的条件。

default int 是从第一个正式公布的 K&R C (1978年) 继承下来的, 而 C 的历史更早。我们今天仍然能够看到历史的阴影, 比如 default int 以及很多今天看上去很奇怪的简写 strcpy, strcmp, memcpy 等等。

使用特权

评论回复
26
mxh0506| | 2011-3-17 22:12 | 只看该作者
好多年不用KEIL了,应该不会没有警告吧?是不是你修改了警告级别?
别的C编译器是会给出警告的:
Warning[Pe260]: explicit type is missing ("int" assumed)
而C++编译器会将其视为一个错误:
error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

使用特权

评论回复
27
baiyajun| | 2011-3-17 22:19 | 只看该作者
符合C标准了,keil自然不会给出警告

使用特权

评论回复
28
XIANSir|  楼主 | 2011-3-17 22:47 | 只看该作者
楼上大侠们为什么不仔细看一下我在25楼的发言呢!:'(

如果没耐心,请直接看25楼的第七条。那是我现在的诉求!

使用特权

评论回复
29
highgear| | 2011-3-17 23:55 | 只看该作者
29楼:
不要问编译器能为你做什么,而是要问你能为编译器做什么。

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
adams.gh + 1
123jj + 1
30
areshan| | 2011-3-18 00:20 | 只看该作者
还是自己写的规范点好!编译器毕竟不是你写的!

使用特权

评论回复
31
sqsihunzi| | 2011-3-18 01:17 | 只看该作者
还是好好看一下C语言吧

使用特权

评论回复
32
123jj| | 2011-3-18 05:11 | 只看该作者
29楼:
不要问编译器能为你做什么,而是要问你能为编译器做什么。
highgear 发表于 2011-3-17 23:55



highgear老师正解!

人要适应编译器,适应C标准,除非是你做个X标准,你想咋整就咋整~~~ :lol

使用特权

评论回复
33
XIANSir|  楼主 | 2011-3-18 08:50 | 只看该作者
本帖最后由 XIANSir 于 2011-3-18 08:52 编辑

嗯,仔细看了一下,大家的意见其实很集中:

C语言规范就是这样规定的,你就得遵守!

我是这样理解大家的意思的:其实C语言这个特性确实不好,可这就是C语言规范的规定,所以你就从了吧:lol——不从你能怎么滴!

好吧,我接受大家的意见,只能是从了!

呵呵,开个玩笑,轻松一下;P,其实从这个帖子大家的回复俺又学到了一个C语言非常非常(此处省略n个字)的特性,对C语言的了解和认识又多了一些!非常感谢大家的热心帮助。

这个问题,答案已经很清楚了,我也没有必要再纠结了!所以,我要结贴了!

使用特权

评论回复
34
t.jm| | 2011-3-18 09:03 | 只看该作者
谁说没有警告?无聊地测试了一下:
compiling gpio_blinky.c...
gpio_blinky.c(66): warning:  #260-D: explicit type is missing ("int" assumed)linking...
Program Size: Code=1696 RO-data=188 RW-data=16 ZI-data=256  
User command #1: fromelf --bin --output .\rvmdk\gpio_blinky.bin .\rvmdk\gpio_blinky.axf
".\rvmdk\gpio_blinky.axf" - 0 Error(s), 1 Warning(s).

使用特权

评论回复
35
huangqi412| | 2011-3-18 09:03 | 只看该作者
自己多注意

使用特权

评论回复
36
XIANSir|  楼主 | 2011-3-18 09:45 | 只看该作者
35# t.jm
非常感谢前辈的提示!

根据.axf后缀名可以知道,你用的是ARM编译器,而我用的是C51编译器,所以,俺没有欺骗前辈!!!

俺也做了一下测试,具体情况见下帖!

使用特权

评论回复
37
XIANSir|  楼主 | 2011-3-18 10:04 | 只看该作者
看来俺结贴结早了。多亏35楼t.jm前辈的提醒,否则,俺可能记下一个错误的结论。 非常感谢t.jm前辈的提示。
下面是我做的测试,几乎完全相同的程序,只有main的返回值有所不同(C51为void,ARM为int):

使用特权

评论回复
38
XIANSir|  楼主 | 2011-3-18 10:06 | 只看该作者
请问大侠们,是不是C51和ARM遵守不同的C语言规范啊???

使用特权

评论回复
39
ayb_ice| | 2011-3-18 10:18 | 只看该作者
标准的C肯定是不需要警告,但很多C编译器尽量和C++靠拢,C++那样是不行的

使用特权

评论回复
40
qymcs| | 2011-3-18 10:27 | 只看该作者
先不管c语言、做为编译器,我个人认为应该考虑周到,多点警告是个好事!!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则