2010-09-13 75 views
0

我设置了一类:定义静态二维数组与内联函数

class Example { 
    static const float array[3][8]; 
}; 

实施

inline const float below_center(const float pos) { 
    return pos - (size/2); // size is a const float 
} 

inline const float above_center(const float pos) { 
    return pos + (size/2); 
} 

inline const float *set_pos(const float x, const float y) { 
    return (float []) { 
     below_center(x), below_center(y), 
     below_center(x), above_center(y), 
     above_center(x), below_center(y), 
     above_center(x), above_center(y), 
    }; 
} 

const float Example::array[3][8] = { 
    set_pos(2.0f, 0.0f), 
    set_pos(-1.0f, -1.0f), 
    set_pos(1.0f, -1.0f), 
}; 

但是当我这样做,我得到一个错误说,“'常量浮动*'到'初始化中的'const float'“。我明白错误在说什么,但是它是在说'const float',以及如何使用细分的内联函数来实现我的数组。

回答

1

你不能那样做。使用宏:

#define BELOW_CENTER(pos) ((pos) - (size/2)) 
#define ABOVE_CENTER(pos) ((pos) + (size/2)) 

#define SET_POS(x, y) {    \ 
    BELOW_CENTER(x), BELOW_CENTER(y), \ 
    BELOW_CENTER(x), ABOVE_CENTER(y), \ 
    ABOVE_CENTER(x), BELOW_CENTER(y), \ 
    ABOVE_CENTER(x), ABOVE_CENTER(y) \ 
} 

const float Example::array[3][8] = { 
    SET_POS(2.0f, 0.0f), 
    SET_POS(-1.0f, -1.0f), 
    SET_POS(1.0f, -1.0f), 
}; 
+0

使用内联的全部要点是避免使用宏。那么内联的内容是什么? – NebulaFox 2010-09-13 18:48:30

2

您返回的(float[]) {....}是不合法的,因为复合文字将会发出一个自动数组,并且您正在返回一个指向自动数组的指针,如果控制流离开该函数,它将被销毁。你会得到一个悬挂指针。

这也是C99的功能,让你的代码确实是C++/C99 :)


编译器检测在编译时是初始化数组的第二个问题。在此,适用大括号。由于const float*无法初始化const float[8],因此编译器会采用大括号并尝试使用const float*初始化array[0][0..7]的第一个成员。这也不会起作用,并且由错误消息反映出来。

您将不得不在运行时使用某种循环来填充该数组,或者您将不得不在数组初始化中指定初始值,类似于在return语句中的操作方式。


由于您使用C++ C99,为什么不结合功率和使用[boost|tr1]::array

inline const boost::array<float, 8> set_pos(const float x, const float y) { 
    return (boost::array<float, 8>) {{ 
     below_center(x), below_center(y), 
     below_center(x), above_center(y), 
     above_center(x), below_center(y), 
     above_center(x), above_center(y), 
    }}; 
} 

const boost::array<boost::array<float, 8>, 3> Example::array = {{ 
    set_pos(2.0f, 0.0f), 
    set_pos(-1.0f, -1.0f), 
    set_pos(1.0f, -1.0f), 
}}; 

要注意的是C++和C99之间的inline语义不同。最好确定什么语义适用于你的程序。

+0

理论上,应该没有悬挂指针,因为它是内联函数。除非C++和C中的这种差异? – NebulaFox 2010-09-13 18:51:53

+0

@Kuroutadori不,理论上这个调用评估为一个悬挂指针。这是关于使它成为悬挂指针的语义,而不是关于实际的实现。呼叫是否实际内联是未指定的。即使它被内联,优化器也可以假设它喜欢的任何东西,包括使用垃圾来初始化数组,因为代码具有未定义的行为。 – 2010-09-13 18:55:22

+0

绍布 - 我明白了。 – NebulaFox 2010-09-13 18:59:08