免费注册 查看新帖 |

Chinaunix

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

[C] c89和c99对变量的定义位置到底有什么区别? [复制链接]

论坛徽章:
7
处女座
日期:2014-08-23 21:10:59程序设计版块每日发帖之星
日期:2015-06-15 22:20:00程序设计版块每日发帖之星
日期:2015-06-20 22:20:00程序设计版块每日发帖之星
日期:2015-07-05 22:20:00每日论坛发贴之星
日期:2015-07-05 22:20:00操作系统版块每日发帖之星
日期:2015-07-13 23:17:46程序设计版块每日发帖之星
日期:2015-12-16 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-09 20:27 |只看该作者 |倒序浏览
  1. #include<stdio.h>
  2. #include<stdbool.h>

  3. int main()
  4. {
  5.     fun();
  6.     printf("\a");
  7.     printf("%d",sizeof(long int));
  8.     bool bRet = false;
  9.     _Bool bRet2 = false;
  10.     return 0;
  11. }
  12. void fun()
  13. {
  14. }
复制代码
分别用c89 c99编译,似乎没有区别

gcc -std=c89 -o hello  -Wall hello.c

gcc -std=c99 -o hello  -Wall hello.c

记得vs2008里,对变量是不允许出现在中间位置,也就是说,变量必须在函数的开头地方。

gcc是没有遵循还是什么原因?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2015-08-09 21:15 |只看该作者
chouxiaoya8100 发表于 2015-08-09 20:27
分别用c89 c99编译,似乎没有区别

gcc -std=c89 -o hello  -Wall hello.c

VS没有遵循新标准。

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
3 [报告]
发表于 2015-08-09 22:54 |只看该作者
加 参数 -pedantic

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
4 [报告]
发表于 2015-08-10 08:21 |只看该作者
回复 1# chouxiaoya8100

你的意思是说在VS2008里面,只能在function的开始部分声明变量?

或者说下面的是不行的:
  1. void foo(void)
  2. {
  3.     int a;

  4.     for (int index = 0; index < 10; index++)
  5.     {
  6.         double tmp = 0.0;
  7.     }
  8. }
复制代码

论坛徽章:
7
处女座
日期:2014-08-23 21:10:59程序设计版块每日发帖之星
日期:2015-06-15 22:20:00程序设计版块每日发帖之星
日期:2015-06-20 22:20:00程序设计版块每日发帖之星
日期:2015-07-05 22:20:00每日论坛发贴之星
日期:2015-07-05 22:20:00操作系统版块每日发帖之星
日期:2015-07-13 23:17:46程序设计版块每日发帖之星
日期:2015-12-16 06:20:00
5 [报告]
发表于 2015-08-10 09:19 |只看该作者

是的,有一年,我去面试,机考,


对方的工具是2008

代码死活编译不过去,面试官就然给我把申明放在函数开头。

我那时候还以为这是C的特性呢。



gcc -o hello -Wall -g -pedantic -std=c89  -ansi hello.c

这个也不会警告变量必须要放在 函数的执行语句之前。



你百度搜索“可在块的任何位置都可以声明变量”, 会搜到很多文章讲解c89有个这个限制。




回复 4# fender0107401


   

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
6 [报告]
发表于 2015-08-10 09:54 |只看该作者
我好像记得只有Fortran有这种要求。

不过我写C的时候都是指定编译器用c99,貌似从来没有用过c89。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
7 [报告]
发表于 2015-08-10 09:55 |只看该作者
百度了一下,c89还真是有这个限制。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
8 [报告]
发表于 2015-08-10 14:03 |只看该作者
hello.c:10:5: 警告:ISO C90 does not support boolean types [-Wpedantic]
     _Bool bRet2 = false;
     ^
这是你上面代码给出的其中一条警告,_Bool 也是C99里的东西,你用这条语句来测试你的目的,但是你期望的警告被上面的警告掩盖了。但是如果在这条语句前面加一句int a = 3;,那么会多出这样一条警告:
hello.c:9:5: 警告:ISO C90 不允许混合使用声明和代码 [-Wdeclaration-after-statement]
     int a = 3 ;
     ^
这条警告就是针对变量的定义位置的。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
9 [报告]
发表于 2015-08-10 14:06 |只看该作者
加上英文的警告信息输出:
hello.c:9:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     int a = 3 ;
     ^
hello.c:11:5: warning: ISO C90 does not support boolean types [-Wpedantic]
     _Bool bRet2 = false;
     ^

论坛徽章:
0
10 [报告]
发表于 2015-08-10 16:17 |只看该作者
回复 9# Monox
至少说明一个问题 你的gcc 和我的gcc 版本不一致。


我确实是按照你说的int val =0;加了这一句后,才出现iso c90这种警告。

但是为什么不加就不出警告呢?

原因,恐怕不是你说的。

我发完整的。
  1. #include<stdio.h>
  2. #include<stdbool.h>
  3. int main()
  4. {
  5.     fun();
  6.     printf("\a");
  7.     printf("%d",sizeof(long int));
  8.     bool bRet = false;
  9.     _Bool bRet2 = false;
  10.     return 0;
  11. }
  12. void fun()
  13. {
  14. }
复制代码
  1. gcc -o hello -Wall -g -pedantic -std=c89  -ansi hello.c
  2. hello.c: In function ‘main’:
  3. hello.c:5:5: warning: implicit declaration of function ‘fun’ [-Wimplicit-function-declaration]
  4.      fun();
  5.      ^
  6. hello.c:7:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
  7.      printf("%d",sizeof(long int));
  8.      ^
  9. hello.c:9:11: warning: unused variable ‘bRet2’ [-Wunused-variable]
  10.      _Bool bRet2 = false;
  11.            ^
  12. hello.c:8:10: warning: unused variable ‘bRet’ [-Wunused-variable]
  13.      bool bRet = false;
  14.           ^
  15. hello.c: At top level:
  16. hello.c:12:6: warning: conflicting types for ‘fun’ [enabled by default]
  17. void fun()
  18.       ^
  19. hello.c:5:5: note: previous implicit declaration of ‘fun’ was here
  20.      fun();
  21.      ^
复制代码
看到没,是没有你说的不支持_Bool

gcc --version
gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


顺便说一句,我有2台机器,第2台机器 出现了“warning: ISO C90 forbids mixed declarations and code”(注意,我并没有添加int val)
gcc版本:
gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)



总结: gcc并没有很良好的支持所谓必须把变量的定义放在函数开头那里。

c89确实规定了,必须放在函数开头。



   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP