• 締切済み

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

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

  • otaks
  • お礼率53% (270/507)

みんなの回答

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

ANSI Cでは constは規定されていますし現状の殆どのCコンパイラが実装している筈です。 使用しているコンパイラが古すぎるという事はありませんか? 下記ソースは何のエラーにもならず実行可能です。 // --- test1.c ----- #include <stdio.h> const int hoge = 3; const char *bar = "HOGEHOGE"; int main(int argc,char *argv[]) { printf("hoge=%d bar=%s\n",hoge,bar) ; return 0 ; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

いくらなんでも 「関数の外では定数は宣言できません」 なんてことはありえません. お使いの C コンパイラ及び実際のエラーメッセージと関連するソースを「解釈しようとせず一字一句そのまま」載せられませんか?

otaks
質問者

補足

たしかにcodepadで実行しても、エラーが 出ません。。。 エラーが出たのはmakeファイルを使用していたので、 makefileの中で何かエラーが出るようなオプションを 使用していたのかもしれません。 現在使用している環境からは参照できない位置にその ファイルが存在していますので、後日補足いたしますm(..)m

関連するQ&A

  • c#のマクロ定義について

    C言語でマクロ定義の場合以下のようにヘッダファイルに#defineで定義しますが、C#の場合どのようにすればいいのでしょうか。 C言語の場合 *** test.h *** #define TEST 5 C#の場合 public const int TEST = 5; //これでいいの? 専用のclassを用意するの? 初歩的な質問ですが宜しくお願い致します。

  • ソースとヘッダについて

    VC++2008を使っています。これは他でもいえるのではないかと思いますが、一応プロジェクトの種類はWindowsFormアプリケーションです。 字数削減や書きなおしを楽にするために、ある程度のマクロを織り交ぜたコーディングをしたいのですが ソースに#defineしたものの効果範囲は、#undefの場所まで あるいはそれがなければそのソースの終了地点まで でしょうか? もしそうなら、ソースに書く分なら「別のソースに同じマクロを、全く違う定義をして使っても問題ない」という事でしょうか? ヘッダに書いた場合は、なんか#undef文を下の方に書いてもまるで上に書いたかのように「駄目」という判定になってしまったのですが、かといって#undefを書かないとそのヘッダをインクルードする他のヘッダにも影響を与えてしまうようで… これをどうにかできる方法はありませんか? また、ソースでは #pragma once などをしなくてもいいのですか? (あるいは書いてもソースはオブジェクトファイルに変換され、実質的にはコンパイル後に影響が出るため、プリプロセッサはコンパイル前に完了するので、ソースにこれを書いたところで無意味ということでしょうか?)

  • C# 定数定義

    c#での定数定義についてですが、定数用のclassを定義したのですが この場合、定数を使用する各classで継承をしなくてはいけないですが、もっといいやり方等があれば教えてください。 public abstract class define { public const short NET_BUFF = 1024; } class testMain:define {     :     :

  • PHPの関数定義ついて。

    PHPの関数定義ついて。 初歩的な質問かもしれませんが、 define関数での定数定義が、スクリプト実行時に評価されるのはなぜでしょうか。 なぜコンパイル時ではなくスクリプト実行時に評価しなければならないのでしょうか。 また、const文によるクラス定義が、コンパイル時に評価されるのはなぜでしょうか。 なぜクラス定義はコンパイルに評価しても問題ないのでしょうか。

    • ベストアンサー
    • PHP
  • defineで定数が置き換えられない?(C言語)

    #defineについて質問です。 #defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は #include <stdio.h> #define DEF 100 void main(){ printf("#defineで定義された定数はDEFです"); } でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は #defineで定義された定数はDEFです(←置き換えられてない) となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。

  • #defineとconstについて

    C/C++言語では、#defineの他にconstが定数として使えるようになりましたが、今後どちらに統一するか悩んでいます。 constにする利点、欠点や#defineにする利点や欠点など、コーデイングのプロにお聞きしたいです。

  • 2重定義って??

    C言語のプログラミングの勉強をしています。 そこで2重定義というものを知り調べたのですが、良く分かりませんでした。コンパイルの仕組みなども併せて教えてください。お願いいたします。 恐れ入りますが、どなたか初心者にも分かる位のレベルで教えて頂けますでしょうか? 簡単な例があると助かります。 不明点 ・2重定義とは例えば1つの*.hを2つ以上の*.cでインクルードする場合にのみ有効なのか? 自分で調べた結果 2重定義防止用として #ifndef HOGE #define HOGE ~~~~~~~~ #endif 上記のようなことを一般的には行うことは分かったのですが、 これをやったことでどうなるのか??

  • 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; のように代入で使用しているのですが、そこではなにも問題がありません。 いったい何が間違っているのか、どのようにすればうまくいくのかを教えていただきたいと考え、書き込ませていただきました。 皆様、どうぞよろしくお願いします。

  • マクロ内での変数定義

    C言語においてのマクロの仕様を教えてください。 (1)マクロ内でコメントは不可なのでしょうか? (2)マクロ内で変数定義は不可なのでしょうか?  マクロは実行された場所に展開されるだけの認識ですので、  マクロ内で変数宣言されている場合、関数の先頭でしかマクロが使えない? よろしくお願い致します。 ----以下作成コード---- #define TESTMACRO(result,a,b) \ do{ \ int tmpData = 5; \ if( a=0){ \ result = -1; \ continue; \ } \ if( b=0){ \ result = -1; \ continue; \ } \ result = a*b*100; \ }while(0) int main(){ int result = 0; /* 他の処理 */ TESTMACRO(result,a,b);  /* 結果resultのログ表示 */ }

  • Excel2003でマクロを組みました。

    Excel2003でマクロを組みました。 それなりにコードを書き込んだので、ファイルとしての容量が3MBくらいあります。 ためしにソース(Module1~35)を全て削除してみたら、2.2MBまで減りました。 (思ったより減らなかったですが) ファイル容量を減らしたいし、マクロを実行する側としてはソースはいらないので、 C言語のソースをコンパイルして実行ファイルだけを取り出して使うように、 (=プログラムの実行にはソースは必要無いように) Excelファイルからマクロの実行部分だけを抜き出す、 なんてことは可能でしょうか。 マクロとプログラムは違うから不可能でしょうか。

専門家に質問してみよう