Microsoft Visual C++ 5.0を使っています。
いつもLINUXでCのコンパイルをしているのですが、Win上でコンパイルすると
「error C2057: 定数式が必要です。」
とでます。
このエラーの指し示すのは、

double x[N];

というような配列の宣言のようです。
ちなみにNは、ヘッダーに

const int N = 2;

と定義しています。
このエラーを出さなくするにはどうしたら良いでしょうか。
ご回答をよろしくお願いします。

A 回答 (2件)

言葉が足りなかった様に思いましたので補足です。


先程の回答の中で述べた、「constを定数として扱うのはC++の流儀」というのはCではconstが使えないと言うことではありません。
ただ、Cの場合constを用いた場合あくまで変更できない変数という扱いになります。(つまり定数式でなければならない配列定義時の要素数等には使えない)
これに対しC++ではdefineの機能の置き換えとしてconstを推奨していますので定数として扱われる様になったと言うことです。
同様にマクロによるバグを減らす為inline関数の使用も推奨しています。
C++の流儀としてはdefineはあまり使わない方向ということでしょうか。
    • good
    • 0
この回答へのお礼

具体的なご回答ありがとうございました。
例のエラーはなくなり、ようやく実行できました。
ちなみに、inline関数を推奨とのことですが、どのように使ったよいのでしょうか。時間がありましたら、お願いします。

お礼日時:2001/08/29 16:00

Cとしてコンパイルするのならdefineを用いるのが適切かもしれません。


constを定数として扱うのはC++の流儀だった様な気がします。
で、配列の宣言時には要素数は定数で指定しなければいけないよ、と言われているのではないでしょうか。
とりあえず

#define N 2

に変更するというのは駄目ですか?

#VC++のオプション設定の中にコンパイルルールをある程度変更できる部分が
#あったような気がするのですが・・・。
#記憶違いかも・・・。(^_^;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qconst int i ? int const i ?

お世話になります

初歩的な事ですがよろしくお願い致します
const 修飾子って変数型の前につけるの?後につけるの?

//----------------------------------------------------
const int iTest1[] = { 0x0000, 0x0000 };
const int iTest2[] = { 0xFFFF, 0xFFFF };

const int* const piTest[] = { iTest1, iTest2 };
//----------------------------------------------------

const int 型のポインタ配列をロム領域に確保したい場合は変数の後にconst修飾子をつけると思います

const const int* piTest[] = { iTest1, iTest2 };
これだとエラーとなるはずです。。。


そこで、疑問に思ったのが、私の書式だと、const intとconst修飾子は前に着けるのが普通だと思ってました
//----------------------------------------------------
  const int i = 0;
  int const i = 0;
//----------------------------------------------------
でも、どちらでもコンパイルは通ると思います
配置領域を確認した所、どちらもROMに確保されてました
一般的にどちらが正解なのでしょうか?


const const int* piTest[] = { iTest1, iTest2 };
が、エラーになるという事は、int const i が正解なのでしょうか?


教授よろしくお願い致します


ちなみに、組み込み系に特化した話になっています
windows系とかだとconst宣言は何処にいくんですかね・・・
ヒープじゃない予備領域とかあるんですかね・・・

お世話になります

初歩的な事ですがよろしくお願い致します
const 修飾子って変数型の前につけるの?後につけるの?

//----------------------------------------------------
const int iTest1[] = { 0x0000, 0x0000 };
const int iTest2[] = { 0xFFFF, 0xFFFF };

const int* const piTest[] = { iTest1, iTest2 };
//----------------------------------------------------

const int 型のポインタ配列をロム領域に確保したい場合は変数の後にconst修飾子をつけると思います

const const int...続きを読む

Aベストアンサー

> const int* const piTest[] = { iTest1, iTest2 };

これは、

(const int*) const piTest ...

の意味ですね。(正しい文法ではカッコは付けられません)
piTestそのものを修飾するには、constは必ず後ろに付けなければなりません。

> const const int* piTest[] = { iTest1, iTest2 };
> これだとエラーとなるはずです。。。

C90ではエラーですが、C99ではエラーになりません。(警告は出るかもしれません)

実際のところ、どの構成要素を修飾するのかが明確であれば、修飾子は前でも後でも真ん中でもかまわないのです。

const unsigned int x;
unsigned int const;
unsigned const int x;

これらは、どれでもOKです。
もし、どの構成要素を修飾しているのかがよく分からないのであれば、修飾子は必ず後ろに付ける方が無難です。

> どちらもROMに確保されてました
> ちなみに、組み込み系に特化した話になっています

組込みでもPCでも関係ありません。
書き換え不可の静的オブジェクトをどこに配置するかは、リンカの設定で決まります。組込みでも、起動時にROMやフラッシュメモリからいったんRAMに展開することもあるように、PCの場合でもいったんディスクからメインメモリに展開することになります。

> const int* const piTest[] = { iTest1, iTest2 };

これは、

(const int*) const piTest ...

の意味ですね。(正しい文法ではカッコは付けられません)
piTestそのものを修飾するには、constは必ず後ろに付けなければなりません。

> const const int* piTest[] = { iTest1, iTest2 };
> これだとエラーとなるはずです。。。

C90ではエラーですが、C99ではエラーになりません。(警告は出るかもしれません)

実際のところ、どの構成要素を修飾するのかが明確であれば、修飾子は前でも後でも...続きを読む

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

QC++の const int* dataを置き換える C#

C#2005で、C++の const int* dataを置き換えるにはどうしたらよいでしょうか?

メソッドの引数でdataを渡しているのですが、dataは intの配列です。
メソッド内では書きかえられたくないのでC++の時にconstを付けました。
C#ではどのように記述するのが正しいでしょうか?

C++からC#に置き換えていますが、参考になるサイトがありましたら教えてください。

Aベストアンサー

 こんにちは。
 配列をメソッドの引数に渡したいのでしょうか。

 以下の通り
 http://msdn.microsoft.com/ja-jp/library/hyfeyz71(VS.80).aspx

private void test()
{
int[] data = { 0, 1, 2 };
this.Method(data);
}

private void Method(int[] data)
{
//dataを見る
}

 で出来るのではないでしょうか。

 其の他参考になりそうなサイト
 http://ufcpp.net/study/csharp/sp_ref.html

 constキーワードに関しては諦めるしかないと思います。
 例えばC#でwin32APIを呼び出す場合でも、const ???* のパラメータをSystem.IntPtr等として指定します(constである事を意識していない)。

 こんにちは。
 配列をメソッドの引数に渡したいのでしょうか。

 以下の通り
 http://msdn.microsoft.com/ja-jp/library/hyfeyz71(VS.80).aspx

private void test()
{
int[] data = { 0, 1, 2 };
this.Method(data);
}

private void Method(int[] data)
{
//dataを見る
}

 で出来るのではないでしょうか。

 其の他参考になりそうなサイト
 http://ufcpp.net/study/csharp/sp_ref.html

 constキーワード...続きを読む

Q[C++]const int と配列

constについて教えてください。以下のコード
//------------------------------------------------------
#include <stdio.h>
#include <math.h>
const double RANGE = 12.;
const int MESH = 10;
//const int N = (int)(12.0*10); // (1) OK
//const int N = (int)(12.0*MESH); // (2) OK
const int N = (int)(RANGE*10); // (3) NG
//const int N = (int)rint(12.0*10); // (4) NG
double Array[N];
//------------------------------------------------------
をg++ 4.0.1でcompileすると
error: array bound is not an integer constant
とでてきます。(1)(2)ではエラーは出ません。
(1)(2)が良くて、(3)がだめな理由がわかりません。
どなたか教えてください。

constについて教えてください。以下のコード
//------------------------------------------------------
#include <stdio.h>
#include <math.h>
const double RANGE = 12.;
const int MESH = 10;
//const int N = (int)(12.0*10); // (1) OK
//const int N = (int)(12.0*MESH); // (2) OK
const int N = (int)(RANGE*10); // (3) NG
//const int N = (int)rint(12.0*10); // (4) NG
double Array[N];
//----------------------------------------...続きを読む

Aベストアンサー

配列を宣言するときの要素数は, 整数型の定数式が必要です.
この「整数型の定数式」に「リテラル」や「整数型の const 変数」は使えるんですが, 「実数型の const 変数」を使うことはできません. そういうものです.
ISO だと 5.19 Constant expression のあたりに, この制限が書かれています.

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。


人気Q&Aランキング

おすすめ情報