C / C ++中的常量

时间:2010-10-13 22:46:44

标签: c++ c constants

在C或C ++中定义常量有多少种不同的方法?

我已经知道使用const关键字和#define指令。我听说有两种方法可以定义常量,但我从未见过任何其他方法。 还有其他人吗?

3 个答案:

答案 0 :(得分:6)

enum,与enum { some_constant= 2 };

一样

编辑:我也忘了在C ++ 0x标准中添加了constexpr和用户定义的文字。所以实际上有三种方式。

答案 1 :(得分:3)

对于“常量”的基本非正式含义,您有#defineconstenum,其他答案已经提到过。

但至少在我写这篇文章时,还没有人讨论过如何使用它们。

首先,我确定你知道Macros是邪恶的,所以我不会强调这一点:只对#define说“不”(作为定义常量的一种方法)。

其次,enum在需要定义整数类型的常量static成员时会派上用场,代码应该可以移植到较旧的编译器中。

第三,对于“定义”的形式含义,可能有一个非常令人惊讶的微妙之处:

struct Blah
{
    static int const x = 42;     // This is just a declaration, not a definition.
};

int const Blah::x;               // This is a definition (yes!).

int main()
{
    // Use Blah::x here.
}

部分细微之处在于纯粹宣言与定义的视觉形式的交换。在几乎任何其他上下文中,初始化的声明也是定义。但不适用于整数类型的静态成员!

部分细微之处在于,如果没有定义,在某个地方,你不能正式采用Blah::x的地址;它的定义是,正式地,它给它存储。

而且,部分细微之处在于除了历史事故之外没有任何其他理由,你只能对整数类型进行上述操作,而不是例如无论如何double或字符串。

struct Blah
{
    static double const x = 3.14;  // !CAN NOT DO THIS IN C++98.
};

有效创建一个成员常量,例如,键入double,您可以使用模板常量惯用法作为解决方法。有效地完成编译器的工作,它原则上可以重写上面的内容。它是这样的:

template< class Dummy >
struct BlahConstants
{
    static double const x;
};

template< class Dummy >
double const BlahConstants< Dummy >::x = 3.14;

struct Blah
    : BlahConstants< void >
{
    // Whatever.
};

int main()
{
    // Use Blah::x here.
}

例如,您可能希望使用该技巧在头文件中完全定义类Blah

由于对类模板的特殊支持,它起作用 - 因为没有这个特殊规则,在头文件中定义具有static成员常量的类模板实际上是不可能的。

干杯&amp;第h。,

答案 2 :(得分:1)

在C中,有数字常量和字符串文字(例如int i = 5,5是常量)也许这就是它们的含义。