その他プログラムに関する雑多な情報

戻る

C/C++

プログラム関係Tips 戻る
初心者の落とし穴
  • void main(void){/*do something*/}
  •  このようにvoidを明記するのは一部の厳しいコンパイラ(GCCなど)では指定ミスかわざとかを判断するためにmain(void),void main(),main()などとすると警告メッセージを出してくれるので,判断を誤らないため,また,応用のきくソースを作成するために警告を出さないコンパイラを利用するときでもこのようにする人が多い.

  • foo(FLAG_A | FLAG_B | FLAG_C...);
  •  "|"はOR演算子.1,2,4,8...というようにヘッダ等で定義されているフラグでは2進数で合成しても衝突がないため,複数の状態を指定する必要がある場合などに利用されている.

  • 以下のものは正しいか?
  • printf(
    #ifdef JAPANESE
    "こんにちは!\n"
    #else
    "Hello world!\n"
    #endif
    );
    
    
    
    答え…
    
    
    

    正しい。プリプロセッサによる条件分岐マクロはよくマクロ定義に使われるが,こういう使いかたもできる.この場合JAPANESEが定義されていれば日本語で,そうでなければ英語のメッセージを出力す る.

  • どちらが正解?
  • #define AISATSU printf("こんにちは\n");
    
    と
    
    #define AISATSU printf("こんにちは\n")
    
    
    答え…
    
    
    

    どちらも正解.ただし利用するときの形が少し異なる. 前者は

    
    AISATSU
    
    
    でいいが,後者は
    
    AISATSU;
    
    
    としなければならない.プリプロセッサは基本的には単に置換処理をだけなので,セミコロン(";")はあくまで文字列として扱われる.つまりマクロ代入文字にはセミコロン含め全ての文字が含まれる(ただしコメント"//〜","/*〜*/"は一番初めに除去されるのでつけてもよい) 戻る