こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

C言語です。

Effective C++か何かで読んだ
const int hoge = 3;
const char *bar = "HOGEHOGE";
などを使用しようと思ったのですが、
C言語ではコンパイルする際に、
「関数の外では定数は宣言できません」??
のようなエラーが出てしまいました。

そこでこれらを使用するのは諦めて、
#define~を使って定数を使用しました。
(上記のようなエラーが出てしまうのは、
C言語の仕様上、文法がおかしいからだと
思います。そもそもC++に関する本に
載ってるtipsだし^^;)


#defineを使用するように修正して、コンパイルする際に、
既存のソース上のマクロ定義(#define~)と名前が重複するものが
いくつか見つかり、修正に手間がかかりました。

マクロ定義なので、スコープという概念は
適用されないと思うので、既存のソースと新規のソースで
マクロ定義がバッティングしないようにする策としては
どのようなものがあるでしょうか?

今のところ思いつくものとしては以下です。
・新規のソースに関するキーワードをプリフィックスとして使用する
・新規のソースの末尾で#undefをする。(これは試してないので有効か
 どうか自信がありません。)

他に何か有効な策がありましたら教えてください。
よろしくお願いいたします。

投稿日時 - 2009-01-04 01:38:19

QNo.4602055

暇なときに回答ください

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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 ;
}

投稿日時 - 2009-01-04 08:07:53

ANo.1

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

投稿日時 - 2009-01-04 01:47:23

補足

たしかにcodepadで実行しても、エラーが
出ません。。。
エラーが出たのはmakeファイルを使用していたので、
makefileの中で何かエラーが出るようなオプションを
使用していたのかもしれません。

現在使用している環境からは参照できない位置にその
ファイルが存在していますので、後日補足いたしますm(..)m

投稿日時 - 2009-01-04 12:00:31

あなたにオススメの質問