2009-04-27 20 views
3

私は新しい定数の定義の中でいくつかの以前に定義された定数を使用したいと思いますが、私のCコンパイラがそれを好きではない:他の定数の定義にconst変数を使用する方法はありますか?

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 

は、他の定数の値を使用して定数を定義する方法はあります?そうでない場合、この行動の理由は何ですか?

+0

どのコンパイラを使用しますか?私はgccでエラーや警告を受け取ることはありません4.3.3 – VolkerK

+0

このテストではgcc 3.4.5を使用しましたが、もっと複雑なプログラムではCodeWarrior 5.7.0を使用しました。 –

+0

gcc 4.3.3ではこれらのエラー。 C++としてコンパイルするとエラーはありません。そこには有効なので、エラーはありませんが、C言語では、上記のエラーが発生します。 – sth

答えて

7

Const varsを式として定義することはできません。

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

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

プリプロセッサ...厄介ですが、あなたは動く必要があります – BCS

+6

#undef A #undef B #undef C –

+0

C++ 0xは他の変数を使って定数を定義できるconstexpr型指定子を持っています。 –

2

リテラルをconst変数に代入することができるため、プログラムは不正です。 私はあなたがプリプロセッサに行くべきだと思います。

7
整数constの値のためのプリプロセッサマクロに優先して

使用列挙型:CおよびC++での

enum { 
    A = 1, 
    B = 2 
}; 

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

作品。

+0

は、すべてのvarsを "静的なconst int"と同様に動作させないでしょうか? –

+2

Cではなく、C++のみですが、その場合は前に見たconst intである必要はありません。const(または配列サイズ)のイニシャライザの一部として識別子を使用できるだけで十分です。 –

2

結果が定数であることを前提としているので、私はMichael Burrにenumがそれを行う方法であることに同意しますが、定数整数へのポインタを渡す必要がない限り、 '変数'は使用しません実際には定数ですか?)だけですが、列挙型だけです。

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

私は同意しますが、少し怠け者であり、変更可能な値と修正不可能な値を持つもの全体に入ることは望ましくありませんでした。もう一つの小さなシワは、列挙型では、オーバーロード選択の観点から重要な型のコントロールが少ないことです(明らかにC++の問題のみです)。しかし、これらの2つの事柄は非常にまれなコーナーケースです.Enumだけを使用している時間の99.9%が「マニフェスト定数」として機能します。そして、プリプロセッサマクロが持つすべての問題を回避することができます。 –

関連する問題