罪行1
for(int i = 0; i < 1; i++);
for(int i = 0; i < 1; i++);
出现编译错误:i重定义。
这个罪行倒还不算重,因为有一种方法可以化解
#define for      if(0);else for罪行2
void f1(){}
void f2(){return f1();}
这样也编译错误: 'void' function returning a value
当年VC6的编译器作者真是脑袋有屎

解决方案 »

  1.   

    罪行1:两个i?
    罪行2:void 如何 return ?
      

  2.   

    补充两点:
    1、屏蔽重复定义可以在其中一个for循环外部加大括号:
    {
    for(int i=0; i<2; i++)
    {
    }
    }for(int i=0; i<2; i++)
    {
    }2、一般对于返回值为void的函数,要么通过return 返回,要么通过另一个void 函数返回。直接调用就可以了,为什么还要加一个return 呢?
      

  3.   

    罪行1,怎么说呢,VC里边变量作用域的概念问题。实际上:
    debug到for(int i = 0; i < 1; i++);
    之后,你看看就会发现i=1。只能说是一种习惯吧。C#里边的作用域就不是这样的了。
    for(int i = 0; i < 1; i++);
    for(int i = 0; i < 1; i++);
    在C#里边就不会报错了。
      

  4.   

    楼主的第二个例子是对的、,返回void是很有道理的。
    这个c++之父的著作, c++程序设计语言提到这个问题了
    允许返回void主要是为了模版的需要(呵呵,可能这么说的,原话忘记了,
    大家去看看函数那章,找返回值部分)
      

  5.   

    至于第一个问题
    在vs.net里面已经可以了。
      

  6.   

    看来许多人还在认同VC6的罪行2。
    请大家去看看GCC cygwin VC7的结果吧。
    在cygwin中就算return void(0);都是可以通过的。很多人都不明白为什么void 也想要return一个东西。
    我觉个例子:
    //代码一
    void f1(){}
    void f2()
    {
      if (something)
      {
    f1();
    return;
      }
    }
    //代码二
    int f1(){}
    int f2()
    {
      if (something)
      {
    return f1();
      }
    }
    代码一与代码二分明就是在执行同样的任务,可以因为VC6的这一罪行,我无法把它们合并。
    迫使程序员在几个不同的地方维护相同内容的代码,这是对劳动力的极大浪费。这还不算罪大恶极吗?
      

  7.   

    如果生气的话,那就用用gcc吧。到时候有得你呛的
      

  8.   

    代码组织得不好是你自己的问题,不是编译器的问题。
    代码2既然不能编译通过,你又用它干么?合并是基于代码可以工作这个前提的。
    return f1()每个人都可以理解成f1();return;?至少用VC6的会认为代码有误。
      

  9.   

    请大家相信我,真的是编译器的问题。
    这一点无论是从理论(void 本身就可以理解成一种类型),
    方便性(简化代码书写、可利用模版),还是从标准(ISO/IEC 14882)来看,都是VC6的失败。原来思维的局限不仅仅会因为编程语言,还会因为编译器的缺陷。
      

  10.   

    同意!编译器的问题!
    其实VC本来就不是标准ANSI C编译器。
      

  11.   

    vs6 service pack 6都出了
    还没有改掉这个缺陷阿楼主?
    赶快找微软反映一下,以便解决全球程序员遇到的这么严重问题!!编译器是死的,人是活的.
    呵呵想起哲学老师讲过的一句话!什么什么是不以人的意识为转移的。呵呵
    变通变通拉
      

  12.   

    楼主已经说明是函数模板的问题了,从函数模板的角度说,确实是编译器的一个bug
      

  13.   

    同意hopen(哈雷) 后面一句话!"微软在引领程序员的习惯,而不是适应程序员的习惯"
      

  14.   

    想起那篇说CString恶心的帖子。
    其实,道理一样。微软的东西设计之初并没有ANSI表准啊,延续下来也是很自然的事情。至于能不能返回void的讨论这件事情本身并没有太大的意义,你可以有自己编码的风格,微软也可以有自己的编译器风格。何况这个并不是致命的错误,而且大多数的程序员都会避免这样暧昧的用法的。
    而且在.net中微软也正在向ANSI规则靠拢。楼主没必要钻牛角尖了。
      

  15.   

    VC6编译器出来的时候,C++的标准可能还没有定到目前的水准;
    或者就是vc6自己当时弄了一套标准,这个标准和目前C++标准有冲突。hopen(哈雷) 的后半句很有道理!
      

  16.   

    test
    ------------------------------------
    CSDN新版论坛助手:【YY专用版】
      

  17.   

    不知道oyd的MVP是真的还是假的,或者都是用C来写C++程序,这样的东东有什么问题呢,多态嘛。
      

  18.   

    你用vc,当然就得遵守MS的规矩
      

  19.   

    VC 当然有些和标准不一样的地方。
    你没有看到的地方还有更多呢。
    下面的程序你用别的编译器可以运行,但VC 就不行。#include <stdio.h>main()
    {
        float a;
        scanf("%f", &a);
    }还有下面的程序,在TC2.0 下面可以,但在 VC下面正常。
    main()
    {
        float a[2][2];
        scanf("%f", &a[0][0]);
        printf("%f", a[0][0];
    }几乎没有哪个编译器是完美无缺的。
      

  20.   

    不好意思,上面的错了
    下面的程序在TC 下面出错,但在VC 下面正常:
    #include <stdio.h>test(float a[][5])
    {
        scanf("%f", &a[0][0]);
    }main()
    {
        float a[5][5];
        test(a);
        printf("%f", a[0][0]);
    }
      

  21.   

    bigsir(bigsir) 的观点怎么和楼主一样偏激啊。-_-#我们很多时候拿微软的软件是很无奈的。它不好,你就不用吗?它不跟ANSI完全一致你就写不出来高质量的程序了吗?软件也是人做出来的,我们只能要求它更好,却不能要求它没有不好啊。再说,前面很多人也说过,1,VC/MFC开发的时候ANSI的标准还没有出台,你不能要求程序员都是预言家吧;2,.NET里边已经对这些问题进行了修改。
      

  22.   

    sb, vc6是98年出来的,你说的语法是99才制定的c'99.你以为人是神仙啊,有预知未来的能力?
      

  23.   

    hehe 算不上是罪行 吧 哈哈
      

  24.   

    to: pomelowu(羽战士) 
    三条裤衩,好厉害
    理解方式的问题,做出的东西有问题不是我说的重点,我是在做类比,恩,类比
    我们与客户的关系,正如微软与我们的关系一样
    客户对产品的不满意是对的-------------------没错吧
    产品的改进是建立在客户需求的基础上的-------也没错吧
    产品的改进不是必要的-----------------------要结合成本,这点你绝对同意
    如果你作为客户本身都不能提出自己的合理要求,那么怎么能够要求你自己成为一个合格的产品生产者呢---------------------------------我自己的都能凑活,客户也将就吧以上不得不得推论出一个结果,我们绝大多数(也许不包括你)的程序员没有一个很好的职业素养
    包括我自己,那么为什么我们的软件行业不如美日印,大家可以和我一起思考——话题有些太大了,不过你不认识我,对不,所以我也就不害臊了
      

  25.   

    支持楼主啊!绝对的罪行——不过我的伤心事,我就不说出来了! for(int i = 0; i < 1; i++);
    for(int i = 0; i < 1; i++);
      我一直是按c#的作用范围理解的,可是我考试时候,老师给了我零分!
    这是由于微软的愚蠢,带给我的伤害! 呵呵!
      

  26.   

    bigsir(bigsir) 
    很高兴和你探讨,但是也没必要对我进行任何的讽刺。从我忍受微软的产品这一试试推断出我对于我的客户的态度从逻辑上并不严谨。我先再重申一次,之所以不赞同楼主对于VC IDE开发人员的批评是基于两点:1,VC/MFC开发的时候ANSI的标准还没有出台;2,.NET里边已经对这些问题进行了修改。不知道你对于这两点的看法如何?好了,注意上面说的第2点,至少说明微软的东西还是在改进中,至于为什么没有在VC6的SP6里边改正这个,做程序员的应该清楚,有些时候可能作新版本的比打补丁更方便。最后,
    “如果你作为客户本身都不能提出自己的合理要求,那么怎么能够要求你自己成为一个合格的产品生产者呢---------------------------------我自己的都能凑活,客户也将就吧” 
    说的很有现实意义,但是拿我们自己写的东西和微软发布的产品相比又不适合了。对于大多数的中国程序员来说,从事的工作可能是外包性质的吧?也就是说软件的评价是跟客户需求直接相关的。而微软的VS却并不是这样的东西。首先,它的设计时间比较早,而楼主提出的合理要求的理论根据却是在其之后。其次,VS的开发对于客户的需求是建立在泛泛的基础上的,虽然也是需求的产物,但跟国内的外包性质的软件开发性质截然不同。
    也因此于微软的产品如果不是大的漏洞(楼主所说的罪行,愚实在不认为是大漏洞)我的确也就没有提出自己的合理要求,也就“凑合”了。但是,恐怕这个也不能成为你臆测我没有要求自己成为一个合格的产品生产者的一句吧?
      

  27.   

    兄弟:这都是你自己惹的祸,不要怪vc ,OK?
      

  28.   

    同意楼主!!!
    第一个问题很恶心。
    第二个问题,和标准CPP不一致。
      

  29.   

    很正常,我还听说过编译器把do{} while()的 do的内容“优化”掉的,关键要自己注意,写程序尽量用最“苯”的方法写
      

  30.   

    讽刺从哪里说起呢?看看我的,你就不用太敏感了,我也不想把这个争论上纲上线,道个歉先下面正式说
    vc6 和vc。net是一个东西么,我用的是盗版(先不谈这个我知道不对),不知道是不是免费升级,那么我作为一个用户对这个产品有不满,你又不解决,告诉我新的出来了,自己去买,我找个地骂两句有什么不对的,我说的全是事实阿,至于你说的先后,再举个极端的例子;我以前用的电脑不支持3c,但是现在你再卖同样的电脑是不是就说不过去了(标准分强制和非强制)
    ”恐怕这个也不能成为你臆测我没有要求自己成为一个合格的产品生产者的一句吧?“
    这个我从来没有臆测过,我臆测(这个也是个贬义词吧),但是同样作为一个消费者,对其他消费者的不满行为大加评论,有这个必要么,ms的东西越好,对你应该越有利阿,你为什么不要呢??回答我
      

  31.   

    我用VC6编译C程序的时候
    有个子程序中有如下语句
    char a;
    for(i=0;i<=10;i++)
    {
        scanf("%c",&a);
    }
    结果其中的scanf语句不是每个循环都被执行,而是每隔一个循环才被执行一次
    即使此语句不是放在for循环中,当子程序被多次调用时,也是隔一次才执行此语句
    即使把scanf语句换成getc,或者是gets也是如此
      

  32.   

    呵呵,没必要说“三条裤衩,好厉害”这种话吧。用“臆测”是因为你说的“如果你作为客户本身都不能提出自己的合理要求,那么怎么能够要求你自己成为一个合格的产品生产者呢---------------------------------我自己的都能凑活,客户也将就吧”找个地方骂两句,可以;你说的是事实,没错;但是“我以前用的电脑不支持3c,但是现在你再卖同样的电脑是不是就说不过去了(标准分强制和非强制)”3C出来以前很多电脑的电源都不符合3C,难道这就给了你足够的理由去把3C标准出来以前生产电源的厂家的工人都骂为“脑袋有屎”吗?再说,你这个例子太极端,跟我们讨论的问题不具可比性。3C是强制标准,没有3C认证就是不合格;VC6却不会因为这两个问题而被认为是不合格的产品。“ms的东西越好,对你应该越有利阿,你为什么不要呢”我没有说不要,我只是说楼主提着两个观点太尊牛角尖了。微软能够改,我举双手赞成;它不改,我们虽然无奈,但是也没有必要太过专注于这两个对编写软件可以完全没有影响的小问题上面。
      

  33.   

    楼上的用gets也是如此?不应该吧
    我认为是因为你用"%c"所以每次只读取一个字符,而通常输入时会输入一个字符再“回车”一次,这个回车占去了一个循环,所以表象就是“每隔一个循环才被执行一次”
      

  34.   

    又看了一遍 pomelowu(羽战士) 的文章,总结如下
    ms不支持标准的理由;
    1,不直接面对用户——那他卖吗?
    2,跟软件开发性质有关——不好说吧
    3,它的原始版本比标准更早出来——那要标准这种东西干吗
    4,他家卖的另一个更好,已经支持了——vc6不卖了?就算不卖也有个售后问题啊¥%……#
    反正也得罪人了,干脆干到底吧至于我从“反对对Ms不满”判断有些人“没有要求自己成为一个合格的产品生产者”这一点(鼓掌,舌头没乱)解释一下:打车时候听师傅说:我确实没违章,但我跟谁说去阿,到交警支队去,1天就少挣300,干脆就认了。
    存车丢了,家里人都怪我,那小偷就没一点错了么?
    这算不算一种可悲,明明道理在我这边,我却不能去讨个公道,反而还要受到各种批评
    而更可悲的是那些批评我的人,当你习以为常了,错了就能变成对了么大家不觉得自己少了些斤斤计较,少了些应该有的勇气么这些话有些激烈,今天刚因为工资问题和上面吵架,大家见谅
      

  35.   

    同意楼主,不过这些不是大问题吧.在vc7.1里全解决了.
    你看看其他的c++编译器,都完全符合标准?
      

  36.   

    “三条裤衩,好厉害”确实是我的敬佩之言,在这里2年了,还是1条,至于你误会了,我也倒歉了,到此为止吧“我以前用的电脑不支持3c,但是现在你再卖同样的电脑是不是就说不过去了(标准分强制和非强制)”是“现在再卖”这块是重点,又误会了,我已经说了这是个极端,自然不是很贴切3C是强制标准,ansi是非强制,我写了阿,而且这种类比还是具有可比性的
    我想楼主骂人的话也就是气话,大家没必要用这个做文章吧, 这点pomelowu(羽战士)也算是钻牛角尖了”VC6却不会因为这两个问题而被认为是不合格的产品“,这个产品没人说不合格,一直是在说有错误这个问题确实是小,我还真没注意,而且我也不会这么用,我用的也是vc7了,就是不太熟你可以不追究阿,别人可以追究阿,你的意思表达了,我的意思表达了,大家都来表达阿,为什么要批评说话的人呢,他的意思错了么,错了就不能说了么,说了就一定对么,那岂不是又要谁先说谁老大了,还是再制定个说话的标准,我都疯了
      

  37.   

    VC6对C++标准支持不好,有时的确很让人生气
    不过可以用的时间长了,总的来说还可以吧
      

  38.   

    楼主觉得VC++不好,可以去用C++Builder啊,不必在这里胡说看了你写的那几句,我发现你的脑袋里全是那个...
      

  39.   

    void f1(){}
    void f2(){return f1();}既是void,你还return干嘛?自己规范些啊。
    这是小问题哦。
      

  40.   

    "
    void f1(){}
    void f2(){return f1();}既是void,你还return干嘛?自己规范些啊。
    这是小问题哦。
    "
    他是想执行在f2中f1()函数.
    有的老外喜好写这么怪异的东西。