• ベストアンサー

#defineとconstについて

iyomanteの回答

  • iyomante
  • ベストアンサー率60% (14/23)
回答No.3

一般に、C++の場合は#defineによるマクロ定数より、const変数が推奨されます。 #defineは名前空間を無視してしまうので、衝突の可能性があるので。 ただしこれは規約上での話なので、実際には以下のような事情も考えられます。 例えば 純粋にC言語のみで書かれてあるならば、旧来の書き方で問題ないと思います。 これは、定数宣言は一般にグローバルヘッダで行うことが多いので、 旧来のCではタブーとされたグローバル変数になってしまうからです。 また文字列定数の場合については、const変数はロード時にメモリ確保され、 初期化の順番の問題が生じる可能性があり、あまり望ましいと思いません。 実際のところ業務そのものの事情として、ある程度の規模のプロジェクトなら コードの可読性の高い方を選ぶべきだと思います。 規約や記法は水モノであり、数年前推奨の方式が現在否定されることもあります。 個人的には、constと#defineが混在してしまうようであるならば、#defineに統一した 方がよいと思います。 *参考URLは、C/C++コーディング標準のリンク集です

参考URL:
http://www.02.246.ne.jp/~torutk/cxx/codingstandard/links.html

関連するQ&A

  • const 宣言に式を使う。

    クラス内の定数宣言でconstを使いたいんですけど、 constでは式を使うとエラーになるようで、 define() からそのまま const にすることができません。 どうにかしてconstで式を使えるように出来ないでしょうか?

    • ベストアンサー
    • PHP
  • ・Javaで、C言語の#defineに相当するもの

    ・Javaで、C言語の#defineに相当するもの 今までC/C++を使い込んできて、最近Javaの勉強を始めました。 C言語では条件分岐に使う定数を指定するのに#defineをよく使用していたのですが、Javaにもそれに相当するものはあるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • #defineで置き換えられない

    C言語です。詳しい方、よろしくお願いします。 下記のプログラムをコンパイルして実行したら、画像のようになってしまいます。 コンパイラは、CPad for LSI C-86 ver2.31です。 #include<stdio.h> #define clr() printf("\x1b[2J") void main(void) { while(1){ clr(); printf("test"); } } #defineがどうも置き換えられていないようです。 詳しい方、考えられる原因を教えてください。 よろしくお願いします。

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

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

  • C言語でのconstを返す関数

    お世話になります。 C言語では、const の関数というのを認めているようですが、どうも使い方が分かりません。 const int foo() {  これは通常のint foo()とどのように違うのでしょうか。  よろしくお願いいたします。

  • 【PHP】define() て便利なようで不便…

    PHP5ユーザーです。 定数定義のdefine() というのを最近知りました。 一見便利な気がしたのですが、変数とは勝手が違うため不便に感じることがあります。 例えば、 $useEnc = 'EUC-JP'; header('Content-Type: text/html; charset={$useEnc}'); 上記をdefine()で書き直そうとすると代入できません。 また、ヒアドキュメンント内で定数を代入しようとしてもできません。 プロの方はこういうのをどのように扱っているのでしょう。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • c言語で言うところの #define

    スミマセン。教えていただきたいことがあります。 c言語はいくらか経験あるのですが、visual basic 2005 はまったくの初心者です。 visual basic には c言語で言うところの定義マクロプリプロセッサ#define の様な機能はあるのでしょうか? 無い場合、どんな感じで代用していますか? よろしくお願いします。

  • C# 定数定義

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

  • #defineの初歩的な質問

    今c言語を勉強しているのですが #define TEST(tid)tid,#tid これはどういう意味なのでしょうか。 宜しくお願いします。

  • C#.net Define文

    C#.net でプログラムを作成中です。 C++では定数等を#defineで定義していましたが、C#ではDefineは無いとの事です。 C#でC++の#Define に相当する事は出来ないのでしょうか。 やりたい事は 長い同じコマンドを別の文字で代替する事です。 もしC#に#Define文があったとして、以下の様な事を行いたいのです。 #Define NL printf("\n"); NL このコーディングが展開した時、  pritf("\n"); と展開される。 この様な事が出来る文をご存知の方、若しくはこの様な事は出来ないと言う事をご存知の方、よろしく御回答下さい。 よろしくお願い致します。