ls的,不是通过定义一个宏来调用一个函数,TIME_BASE_Q 就是Rational的结构体变量,变量成员被初始化为1和1000000而已吧

解决方案 »

  1.   

    展开后
    fn( (Rational){1,1000000} )
    这是什么语法 ??
      

  2.   

    #define TIME_BASE_Q          (Rational){1, TIME_BASE}
    =============================================
    这个宏能完成结构体的定义,初始化吗?
      

  3.   

    这是因为你碰到了C++规范一个没有明确规定的地方,
    所以编译器对这个“擦边代码”有不同的反映,很正常。
    作为程序员,不要写这样的含糊的代码,没有实际的必要,又不方便移植,切忌。fn( (Rational){1, TIME_BASE} );//这句话的意思其实是告诉编译器,
                                    //我要生成一个匿名的Ratinal类型的变量。
                                    //并且用这个变量作为参数调用fn这个函数。C++的角度来看struct和class关键字唯一的区别就是struct成员默认是public属性。
    GCC编译器一看Rational是struct定义的,所以"{...}"这种方式初始化一个匿名的Ratinoal类型的对象它也接受。可这并不是标准,不信你用-ansi参数来编译,保证GCC编译不过。可是VC编译器不认这套,但这不是VC的错。因为它不标准。解决方法:
    typedef struct Rational{
    Rational(int x,int y)         //加入显式的构造函数
    {
    num=x;
    den=y;
    };
    int num; ///< numerator
    int den; ///< denominator
    } Rational;
    #define TIME_BASE_Q_VC Rational(1,TIME_BASE)  //这样来初始化一个
                                                      //某结构(类)的匿名对象
      

  4.   

    eduyu你太厉害了,对这个问题分析地深入浅出呀,让我受益非浅呀.问题解决了
      

  5.   

    eduyu,我给你SendMessage了,请注意查收