• ベストアンサー

定数式とはどういう意味でしょうか。

Microsoft Visual C++ 5.0を使っています。 いつもLINUXでCのコンパイルをしているのですが、Win上でコンパイルすると 「error C2057: 定数式が必要です。」 とでます。 このエラーの指し示すのは、 double x[N]; というような配列の宣言のようです。 ちなみにNは、ヘッダーに const int N = 2; と定義しています。 このエラーを出さなくするにはどうしたら良いでしょうか。 ご回答をよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • natural
  • ベストアンサー率37% (419/1115)
回答No.2

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

lucky111
質問者

お礼

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

その他の回答 (1)

  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

Cとしてコンパイルするのならdefineを用いるのが適切かもしれません。 constを定数として扱うのはC++の流儀だった様な気がします。 で、配列の宣言時には要素数は定数で指定しなければいけないよ、と言われているのではないでしょうか。 とりあえず #define N 2 に変更するというのは駄目ですか? #VC++のオプション設定の中にコンパイルルールをある程度変更できる部分が #あったような気がするのですが・・・。 #記憶違いかも・・・。(^_^;

関連するQ&A

  • 定数配列の書き方

    VB6で定数を定義する場合は次の通りです。   Const strTest As String = "TEST" では、定数配列を定義する場合はどのように書けばいいのでしょう?   Const astrTest() As String = Array("A", "B", "C")      '→NG   Const astrTest(0 To 2) As String = Array("A", "B", "C")  '→NG いろいろな書き方を試して見たのですが、上記のような書き方でも文法的にエラーになるようです。 どのように書けばいいのでしょうか? それとも定数を配列で定義するのは無理なんでしょうか?

  • C++のvectorについて教えてください。

    C++のvectorについて教えてください。 現在悩んでいる問題について簡単に説明するために、テストコードを書きました。 #include <vector> class IntType { private: int num; public: IntType( int n ):num( n ){}; }; std::vector< IntType > IntVector; void main() { } このコードをDebug版でコンパイルすると 1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(285) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'const size_t' から減少できませんでした 1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2236) : 'std::operator <' の宣言を確認してください。 のようなエラーが出ます。 しかし、Release版でコンパイルするとコンパイルは通ります。 Debug版でコンパイルを通すにはどのようなコードを追加すればよいでしょうか? 知恵を貸してください。 よろしくおねがいします。 /** VisualStudio2008 AcademiEdition */

  • C言語における定数の使用方法

    こんにちは。 今日質問したいのは、タイトルにありますように、C言語における「定数」の使い方についてです。 私は現在、Visual C++を用いてC言語のプログラミングを勉強しているのですが、条件文(if文)に定数を用いてコーディングを行おうとしても、どうしてもエラー表示が出て、うまくコンパイルすることができません。 具体的には、 if(No>=1 && No<=10){ //具体的な処理部分 } というif文を、予めヘッダファイル内にて定義した定数 #define start 1; #define stop 10; を用いて次のように、 if(No>=start && No<=stop){ //具体的な処理部分 } コーディングしたいと考えています。 しかし、これをコンパイルするとエラーが発生してしまいどうにもうまくいきません。 また、定数ではなく数字で記述するとうまく回ります。 別のところで定数を、 wk = start; のように代入で使用しているのですが、そこではなにも問題がありません。 いったい何が間違っているのか、どのようにすればうまくいくのかを教えていただきたいと考え、書き込ませていただきました。 皆様、どうぞよろしくお願いします。

  • エクセルVBAの定数

    こんにちは! 定数について質問です。 VBAのユーザー定義定数ってVBEに記述する以外に宣言する方法はありませんでしょうか?詳しくないですがC言語のようにヘッダーファイルにリンクするように手軽でやりたいのですが無理でしょうか?

  • ヘッダーの多重定義での疑問です。

     Cで開発をしているのですが、ヘッダーファイルでの定義ではたとえば、int a と か double hoge とか定義して、そのヘッダーファイルを複数の cファイルが読み込むと多重定義になりますよね? hoge.h int a; // 多重定義 このヘッダーを複数の.cファイルに読み込む しかし、自分のプロジェクトだと、ヘッダーファイルにint aとかdouble hogeとか 定義してもエラーにならないんです。 ただし、int b = 10;のように代入すると多重エラー また、試しに新しくプロジェクトを作ってヘッダーで定義すると多重定義でエラーでした。

  • constの位置

    申し訳ありませんが、続けて質問させていただきます。 char const と const char は同じ意味でしょうか。 次のプログラムは配列をconst charと宣言しています。 ary[1]='N'; の行で、意図した通りにコンパイルエラーになります。 これはchar constと宣言しても、同じ意味なんでしょうか。 #include <stdio.h> int main(void) { const char ary[ ] = { 'A', 'B', 'C', '\0' }; ary[1] = 'N'; printf("aryは%s\n", ary ); return 0; } また、 const int a=1; int const a=1; この2つは同じ意味でしょうか。

  • SolarisとLinuxのグローバル変数の扱いについて

    Solaris用のソースをLinuxで使えるように変更したいのですが、 グローバル変数について以下のようなことが発生していて困っています。 なにか、コンパイルオプションなどで対応はできないものでしょうか? Solaris (CC)では 特にextern宣言しなくても同じシンボルの外部変数はコモンセグメントに1つだけ作成しコンパイル自体は正常である。 しかし、Linux (g++)では externを宣言しないと同じシンボルを再定義したことになりエラーとなる。 これにより、グローバル変数を多用しているプログラムはLinuxでうまくコンパイルができない。 しかし、単純にextern宣言での対応は難しい。 extern宣言は外部で定義してあるグローバル変数を参照する というものだがLinux では 1つの定義を意外は全てexternしなければ、2重定義エラーになってしまう。 つまり、実体が1つであとはそれを参照しているという形でなければいけない。 ところが、その実体をどこにするか特定することができない。 例えば、gというグローバル変数を仮定する。 A.c,B.c,C.cはその3つのソースよりAA.aという静的ライブラリを構成する。 gはA.cで定義してありB.c,C.cはそれを参照する。 ところが C.cは個別にC.oというオブジェクトで他からの呼び出しがあり 別LMにリンクされる。 その時C.c内のgは実体を失うことになり未定義となる。 つまり、どれが実体になるかは何にリンクするかで決まるため 実態を特定できない。 また、共通のヘッダにグローバル変数が定義されている場合も、重複するというエラーを起こすため、 共通ヘッダからグローバル変数を分離し、何れかのソースにグローバル変数の実態を定義させる必要がある。 共通ヘッダを使っている他のソースはそのグローバル変数の実態を参照するようにexternの宣言をする。

  • 新規ソース内のマクロ定義が既存ソース内のマクロ定義と衝突しない策について

    C言語です。 Effective C++か何かで読んだ const int hoge = 3; const char *bar = "HOGEHOGE"; などを使用しようと思ったのですが、 C言語ではコンパイルする際に、 「関数の外では定数は宣言できません」?? のようなエラーが出てしまいました。 そこでこれらを使用するのは諦めて、 #define~を使って定数を使用しました。 (上記のようなエラーが出てしまうのは、 C言語の仕様上、文法がおかしいからだと 思います。そもそもC++に関する本に 載ってるtipsだし^^;) #defineを使用するように修正して、コンパイルする際に、 既存のソース上のマクロ定義(#define~)と名前が重複するものが いくつか見つかり、修正に手間がかかりました。 マクロ定義なので、スコープという概念は 適用されないと思うので、既存のソースと新規のソースで マクロ定義がバッティングしないようにする策としては どのようなものがあるでしょうか? 今のところ思いつくものとしては以下です。 ・新規のソースに関するキーワードをプリフィックスとして使用する ・新規のソースの末尾で#undefをする。(これは試してないので有効か  どうか自信がありません。) 他に何か有効な策がありましたら教えてください。 よろしくお願いいたします。

  • マップとアルゴリズム

    またまた質問です。 以下の処理をさせるとエラーが出ます。 どなたか見ていただけますか? 環境はWindows XP, Visual Studio.NETです。 -----処理部分------------------ map<char, int> m; for(i=0; i<10; i++){  m.insert(pair<char, int>('A'+i, i)); } reverse(m.begin(), m.end()); map<char, int>::iterator p; p = m.begin(); while( p != m.end() ){  cout << p->first << " " << p->second << endl;  p++; } ------以下エラーログ--------------- C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(16) : error C2166: 左辺値は const オブジェクトに指定されています。 C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(46) : コンパイルされたクラスのテンプレートのインスタンス化 'void std::swap<const _Ty1>(const _Ty &,const _Ty &)' の参照を確認してください with [ _Ty1=int, _Ty=int ] C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(45): クラス テンプレートのメンバ関数 'void std::pair<_Ty1,_Ty2>::swap(std::pair<_Ty1,_Ty2>::_Myt &)' のコンパイル中 with [ _Ty1=const int, _Ty2=int ] ClusteringMain.cpp(45) : コンパイルされたクラスのテンプレートのインスタンス化 'std::pair<_Ty1,_Ty2>' の参照を確認してください with [ _Ty1=const int, _Ty2=int ] C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(16) : error C2166: 左辺値は const オブジェクトに指定されています。

  • 【C言語】配列の中に配列を入れたい

    const double A[2] = {1.0, 2.0}; double B[2][3] = { { A[0], A[1], 0.0 }, { 0.0, 0.0, 0.0 }}; このようなプログラムをコンパイルしようとすると、 初期化子の要素が定数ではありません というエラーが出てしまい困っています。どのように解決したらいいでしょうか。 OSはlinux、コンパイラgccです。

専門家に質問してみよう