我有一个像素结构。我想在它内部去除静态常量,用于BLACK和WHITE等颜色。我正在写一个头文件中的所有内容,它将包含在多个cpp文件中。
struct Pixel
{
typedef uint16_t quantum_t;
static const quantum_t MAX_QUANTUM = 0xffffL;
static const quantum_t MIN_QUANTUM = 0;
static const int QUANTUM_BITS = 16;
quantum_t r, g, b;
Pixel(quantum_t r_ = 0, quantum_t g_ = 0, quantum_t b_ = 0) :
r(r_), g(g_), b(b_) { }
template<typename T>
static T clamp(T x)
{
return x > MAX_QUANTUM ? MAX_QUANTUM : (x < MIN_QUANTUM ? MIN_QUANTUM : x);
}
template<typename T>
static Pixel clamp(T r, T g, T b)
{
return Pixel(clamp(r), clamp(g), clamp(b));
}
static const Pixel BLACK;
static const Pixel WHITE;
};
const Pixel Pixel::BLACK(0, 0, 0);
const Pixel Pixel::WHITE(Pixel::MAX_QUANTUM, Pixel::MAX_QUANTUM, Pixel::MAX_QUANTUM);
最初我尝试初始化结构中的静态BLACK和WHITE但是我从g ++那里得到一个关于不完整类型的错误。一旦我在结构外部声明了静态变量,错误便消失了,代码现在编译完毕。这是一个只有标题的库,我想知道的是,如果它包含在多个cpp文件中,那么会声明这样的静态变量会导致编译问题吗?
答案 0 :(得分:1)
将声明这样的静态变量会导致编译问题 如果它包含在多个cpp文件中?
不,因为C ++标准允许这种特定用法,除非它们被声明为extern
,否则它们将不会被看到或与其他翻译单元中的同一命名变量的其他实例(即cpp文件)冲突。