如何让CodeBlocks支持C99

软件和网站开发以及相关技术探讨
lonelyma1021
帖子: 10
注册时间: 2009-05-18 14:26

如何让CodeBlocks支持C99

#1

帖子 lonelyma1021 » 2009-08-14 11:04

安装好了codeblocks之后编写程序,其中有一个问题,for()语句中定义的变量不能重复使用。也就是for(int i=0;i<10;i++).......for(i=0;i<12;i++)这种情况在编译的时候会报错,看了一下说是不支持这种语法要我换成另一个ISO标准语法。上网查了一下,说是GCC在默认情况下不支持C99而是C94,C94不允许如上使用for语句。我看了解决方法是在调用gcc的时候加上 -std=C99 的开关,可是我是在IDE中写程序,并不是单独编译。请问各位,怎么在CodeBlocks里设置,让编译器支持C99呢?
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 如何让CodeBlocks支持C99

#2

帖子 linjiework » 2009-08-14 16:37

从编程角度来讲,不推荐这样做。因为这样不仅你在编写时要小心对待变量的作用域,在别人读你程序时,也会很头疼。

要是在公司里用这种方法写程序,会被骂的。

建议你最好别这样写程序。
阿呆 : 天下第一呆!
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 如何让CodeBlocks支持C99

#3

帖子 BigSnake.NET » 2009-08-14 16:48

楼上的搞错了吧, 在 C99 之前 for (int i = ... 的确是不合法的..
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 如何让CodeBlocks支持C99

#4

帖子 linjiework » 2009-08-14 16:49

BigSnake.NET 写了:楼上的搞错了吧, 在 C99 之前 for (int i = ... 的确是不合法的..
晕,我没说它是合法的啊。我只是不建议 LZ 这么做而已。
阿呆 : 天下第一呆!
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 如何让CodeBlocks支持C99

#5

帖子 BigSnake.NET » 2009-08-14 16:57

linjiework 写了:
BigSnake.NET 写了:楼上的搞错了吧, 在 C99 之前 for (int i = ... 的确是不合法的..
晕,我没说它是合法的啊。我只是不建议 LZ 这么做而已。
我的意思是
如果你没有 C99 编译器可用
你就不得不这样做 ...
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 如何让CodeBlocks支持C99

#6

帖子 linjiework » 2009-08-14 17:06

BigSnake.NET 写了:
linjiework 写了:
BigSnake.NET 写了:楼上的搞错了吧, 在 C99 之前 for (int i = ... 的确是不合法的..
晕,我没说它是合法的啊。我只是不建议 LZ 这么做而已。
我的意思是
如果你没有 C99 编译器可用
你就不得不这样做 ...

:em20 咱们俩中间肯定有一个人把问题理解错了。
阿呆 : 天下第一呆!
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 如何让CodeBlocks支持C99

#7

帖子 BigSnake.NET » 2009-08-14 17:09

linjiework 写了:
BigSnake.NET 写了:
linjiework 写了:
BigSnake.NET 写了:楼上的搞错了吧, 在 C99 之前 for (int i = ... 的确是不合法的..
晕,我没说它是合法的啊。我只是不建议 LZ 这么做而已。
我的意思是
如果你没有 C99 编译器可用
你就不得不这样做 ...

:em20 咱们俩中间肯定有一个人把问题理解错了。
是这回事的

for(int i=0;i<10;i++).......for(i=0;i<12;i++)

如果你用非 C99 模式编译, 会报错, 原因见上
如果你用 C99 模式编译, 还是会报错, 因为第二个 for 在第一个 for 里面的 i 的作用域之外

那么这种脑残语法谁支持呢?
VC6 .......
这究竟是一个 C 编译器还是 C++ 编译器呢
我也说不清 ....
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 如何让CodeBlocks支持C99

#8

帖子 linjiework » 2009-08-14 17:24

呵呵,我的意思是不管它是否合法,都不推荐这样写,很容易出错的,而且会给别人阅读代码造成困难。
:em09
阿呆 : 天下第一呆!
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 如何让CodeBlocks支持C99

#9

帖子 linjiework » 2009-08-14 17:39

刚才我测试了一下,这个形式 C99 模式是支持的,而且我也觉得它应该支持才对啊。

因为你在 for() 里面的变量定义,在 for 循环体内都是可见的。也就是说 for (int i=0;i<10;i++){ i--; } 这个语句是没有语法错误的(不知道你是否同意我这个观点)

既然在循环体内可见,那么在 for 循环体里的 for 循环里也应该是可见的啊!比如
for (int i=0;i<10;i++){
for (int k=0;k<10;k++){
i--;
}
}

这样语法应该也没错吧。那我把 k 替换成 i 也应该是没错的吧。所以我觉得这个从语法上没有错,而且我写的测试程序也验证了我的想法。

我的测试程序如下:

for (int i=0; i<5; i++) {
printf("1%d\n", i);
for (i=0; i<5; i++) {
printf("2%d\n", i);
}
}
阿呆 : 天下第一呆!
头像
qingshi163
帖子: 275
注册时间: 2007-12-16 0:45

Re: 如何让CodeBlocks支持C99

#10

帖子 qingshi163 » 2009-08-14 17:40

脑残语法 :em20 哈哈,同感 :em05 :em05 :em05
头像
qingshi163
帖子: 275
注册时间: 2007-12-16 0:45

Re: 如何让CodeBlocks支持C99

#11

帖子 qingshi163 » 2009-08-14 17:44

LZ,它再是IDE一样会提供自定义选项(IDE难道不编译了吗 :em25 )……我这里没有C::B,你自己好好找找 :em11
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 如何让CodeBlocks支持C99

#12

帖子 BigSnake.NET » 2009-08-14 18:07

linjiework 写了:刚才我测试了一下,这个形式 C99 模式是支持的,而且我也觉得它应该支持才对啊。

因为你在 for() 里面的变量定义,在 for 循环体内都是可见的。也就是说 for (int i=0;i<10;i++){ i--; } 这个语句是没有语法错误的(不知道你是否同意我这个观点)

既然在循环体内可见,那么在 for 循环体里的 for 循环里也应该是可见的啊!比如
for (int i=0;i<10;i++){
for (int k=0;k<10;k++){
i--;
}
}

这样语法应该也没错吧。那我把 k 替换成 i 也应该是没错的吧。所以我觉得这个从语法上没有错,而且我写的测试程序也验证了我的想法。

我的测试程序如下:

for (int i=0; i<5; i++) {
printf("1%d\n", i);
for (i=0; i<5; i++) {
printf("2%d\n", i);
}
}
人家不是这个意思啦, 两个 for 是同一级..
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
lonelyma1021
帖子: 10
注册时间: 2009-05-18 14:26

Re: 如何让CodeBlocks支持C99

#13

帖子 lonelyma1021 » 2009-08-14 18:13

感谢各位,上面我说的可能有点不太明白,那2个for并不是嵌套的。我的本意是要用2个不相关的for循环,正常的写法就是
for(int i=0;i<10,i++){}......for(int i=0,i<12,i++){}.....但是在VC++6.0里for循环头里定义的变量是全局可见的,也就是说上面的写法在VC++6.0里是会报错的,因为第一个for里的 int i 对于 第2个for是可见的,这样就是重复定义了。所以我就写成了
for(int i=0;i<10,i++){}......for(i=0,i<12,i++){}....其实,这种情况也存在变量 i 的作用域问题。C94标准中for循环头里不可以定义变量,也说是说
for(int i=0;i<10,i++)这个就不能通过编译,必须要把变量 i 的定义提前出来 int i ;for(int i=0;i<10,i++),这么做同样存在关于 i 的作用域问题。所以我才想怎么能让codeblocks支持C99,在C99里for头中可以定义变量,且只在for循环中可见,这样就不用担心作用域的问题了。
LS的,C::B里的编译选项我看过了,只有一个让你选择编译器的地方。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 如何让CodeBlocks支持C99

#14

帖子 BigSnake.NET » 2009-08-14 18:17

lonelyma1021 写了:感谢各位,上面我说的可能有点不太明白,那2个for并不是嵌套的。我的本意是要用2个不相关的for循环,正常的写法就是
for(int i=0;i<10,i++){}......for(int i=0,i<12,i++){}.....但是在VC++6.0里for循环头里定义的变量是全局可见的,也就是说上面的写法在VC++6.0里是会报错的,因为第一个for里的 int i 对于 第2个for是可见的,这样就是重复定义了。所以我就写成了
for(int i=0;i<10,i++){}......for(i=0,i<12,i++){}....其实,这种情况也存在变量 i 的作用域问题。C94标准中for循环头里不可以定义变量,也说是说
for(int i=0;i<10,i++)这个就不能通过编译,必须要把变量 i 的定义提前出来 int i ;for(int i=0;i<10,i++),这么做同样存在关于 i 的作用域问题。所以我才想怎么能让codeblocks支持C99,在C99里for头中可以定义变量,且只在for循环中可见,这样就不用担心作用域的问题了。
LS的,C::B里的编译选项我看过了,只有一个让你选择编译器的地方。
应该有加选项的地方的

真的不行就写个 wrapper 算了

#!/bin/sh
exec gcc -std=c99 "$@"
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
lonelyma1021
帖子: 10
注册时间: 2009-05-18 14:26

Re: 如何让CodeBlocks支持C99

#15

帖子 lonelyma1021 » 2009-08-14 18:40

感谢各位,问题已经解决了。我在C::B的网站找到了解决的方法 http://forums.codeblocks.org/index.php? ... pic=7137.0
看来有这个问题的也不只我一个啊。呵呵,再次感谢大家 。。。
回复