【问题标题】:Is there a way to use const variables in the definitions of other constants?有没有办法在其他常量的定义中使用 const 变量?
【发布时间】:2009-04-27 19:58:57
【问题描述】:

我想在新常量的定义中使用一些以前定义的常量,但是我的 C 编译器不喜欢它:

const int a = 1;
const int b = 2;
const int c = a;         // error: initializer element is not constant
const int sum = (a + b); // error: initializer element is not constant

有没有办法使用其他常量的值来定义一个常量?如果不是,这种行为的原因是什么?

【问题讨论】:

  • 您使用哪个编译器?我没有收到 gcc 4.3.3 的错误甚至警告
  • 我使用 gcc 3.4.5 进行此测试,使用 CodeWarrior 5.7.0 进行更复杂的程序,让我走上这条路
  • gcc 4.3.3 确实给出了这些错误。如果您将其编译为 C++,则不会出现错误,因为它在那里有效,但作为纯 C,您会收到上述错误。
  • 无赖。我可以轻松地使用不同版本的 gcc,但在实际项目中我坚持使用 CodeWarrior。感谢您提供有关新版本 gcc 的提示。

标签: c constants


【解决方案1】:

Const vars 不能定义为表达式。

#define A (1)
#define B (2)
#define C (A + B)

const int a = A;
const int b = B;
const int c = C;

【讨论】:

  • #undef A #undef B #undef C
  • C++0x 将具有 constexpr 类型说明符,允许使用其他变量定义常量。
【解决方案2】:

使用枚举优先于预处理宏来获取整数常量值:

enum {
    A = 1,
    B = 2
};

const int a = A;
const int b = B;
const int c = A;        
const int sum = (A + B);

在 C 和 C++ 中工作。

【讨论】:

  • 不会让所有的变量都变成“static const int”这样的工作吗?
  • 不适用于 C,仅适用于 C++ - 但在这种情况下,您不需要“静态”,只需作为先前看到的 const int 就足以使标识符可用作初始化程序的一部分const(或数组大小)。
【解决方案3】:

您只能将文字分配给 const 变量,因此该程序是非法的。 我认为你应该使用预处理器。

【讨论】:

    【解决方案4】:

    由于结果是恒定的,我同意 Michael Burr 的观点,即枚举是实现它的方法,但除非您需要传递指向常量整数的指针,否则我不会使用“变量”(是常量真的是一个变量吗?)但只是枚举:

    enum { a = 1 };
    enum { b = 2 };
    enum { c = a };
    enum { sum = a + b };
    

    【讨论】:

    • 我同意,但我有点懒惰,不想进入整个可修改与不可修改的左值问题。另一个小问题是,使用枚举,您对类型的控制较少,这在重载选择方面可能很重要(显然只是 C++ 问题)。然而,这两件事是非常罕见的极端情况——99.9% 的时间单独使用枚举作为“清单常量”效果很好。而且您几乎可以避免预处理器宏中固有的所有问题。
    猜你喜欢
    • 2013-08-31
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多