免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: socay2
打印 上一主题 下一主题

[C] C语言使用宏的问题,以前没发现 [复制链接]

论坛徽章:
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
11 [报告]
发表于 2012-11-22 14:09 |只看该作者
回复 9# socay2

VAR_GEN(i) 就是 int int_i
难道你以为宏在运行期起作用,变成 int int_0; int int_1; int int_2; …… ?
   

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
12 [报告]
发表于 2012-11-22 14:10 |只看该作者
回复 5# bruceteen


    谢谢。我想再请教下:
对于这种写法
int i;
for(i=0; i<N; i++)
    int j;

上面的 j 是在局部栈吗? 会和 i 在同一级栈吗? 如何查看它是在那个栈?

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
13 [报告]
发表于 2012-11-22 14:12 |只看该作者
回复 11# bruceteen


    现在肯定不是了,我用 gcc -E 查看了预处理的结果是:
  1. int main()
  2. {
  3. int i = 0;
  4. int int_i;
  5. for(i=1; i<2; i++)
  6.   int int_i;

  7. }
复制代码
但是GCC的错误信息不是变量重定义,而是:
error: expected expression before ‘int’

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
14 [报告]
发表于 2012-11-22 14:23 |只看该作者
bruceteen 发表于 2012-11-22 11:57
{}是局部栈呀

for(;


我又作了进一步验证,表明要在像类似于 for 这种复合语句中定义变量,必须使用 "{}", 即便只有一条语句。
所以汲取教训,就是在这种复合语句中都要使用 "{}".

论坛徽章:
0
15 [报告]
发表于 2012-11-22 15:27 |只看该作者
总结下现在的问题:
  1. for(i=1; i<100; i++)
  2. {
  3.         int bbb;
  4. }
复制代码
这段代码可编译通过。
  1. for(i=1; i<100; i++)
  2.         int bbb;
复制代码
这段代码编译不通过。
俺VC报错为:error C2143: syntax error : missing ';' before 'type'
这得找个熟悉编译器的人或研究标准的人来说明下了,个人认为一般也没这么用的!

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
16 [报告]
发表于 2012-11-22 15:55 |只看该作者
其实原因很简单。

在C里,for,if等等结构后面的部分,需要是“语句”

而声明不是语句。“声明语句”的说法在C99里是错误的。

语句包括:
- 标签语句
- 复合语句
- 表达式语句
- 选择语句
- 循环语句
- 跳转语句

共六种。声明不是语句。

而声明为什么可以写在函数里呢?

因为函数体实际上是“复合语句”,因此函数外面的大括号是必须的(这是复合语句的一部分)。

而复合语句的定义是:

复合语句: 左大括号 + 可选的块项列表 + 右大括号
块项:语句,或者声明。

所以,仅有大括号里面才能够写声明。语法里面说的很明白了。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
17 [报告]
发表于 2012-11-22 15:58 |只看该作者
本帖最后由 starwing83 于 2012-11-22 15:58 编辑

顺便说一下,这也是C和C++的区别之一。C++里,声明(确切地说,块内声明(block-declaration))是语句。可以写到for后面去。

论坛徽章:
0
18 [报告]
发表于 2012-11-22 17:30 |只看该作者
Linux 里面是不是也有这么写的? 但是这个宏写在循环里,并且不使用就有点奇怪了吧?

按照16楼的说话,c++编译器可以编译通过没有括号的?

论坛徽章:
0
19 [报告]
发表于 2012-11-22 18:02 |只看该作者
c++编译器确实可以编译通过没有括号的

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
20 [报告]
发表于 2012-11-22 18:04 |只看该作者
@qiwei9743
c++必须可以:

class a{
  public: a(){printf("hehe";};
};

for(; a ai;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP