C   定数

ホーム   C/C++チュートリアル


define

define.c


#include <stdio.h>

#define NUMBER 255
#define HELLO(name) printf("Hello %s.\n", name);

int main()
{
    printf("%d\n", NUMBER);
    HELLO("Jane")
    
    return 0;
}
    

実行結果


255
Hello Jane.
    

コード説明

  1. #define NUMBER 255
    #define 半角空白 名前 半角空白 値もしくは処理 と記述すると「名前」に「値や処理」を結びつけることができます。
  2. 半角空白の部分は半角であれば幾つでも構いません。タブもOKです。 改行したい場合については後述します。
  3. 「名前」の部分は大文字とアンダースコア _ で記述する慣習になっています。
  4. 一般的に、define で、値と結びつけたものを「定数」、 引数を受け取り一連の処理と結びつけたものを「マクロ」と呼びます。


main( )関数全体を定数(マクロ)にすることもできます。

mainmacro.c


#include <stdio.h>

#define MAIN( message ) int main()\
                        {\
                        printf("%s\n", message);\
                        return 0;\
                        }

MAIN("I am a main.")
    

実行結果


I am a main.
    

コード説明

  1. #define MAIN( message ) int main()\
    define の中で改行を使いたい場合は、行の末尾に \ か ¥ をつけます。 最後の } には \ もしくは ¥ をつけてもつけなくても構いません。


#define の部分は別のファイルとして分けることができます。

mainmacro.h


#define MAIN(message) int main()\
                        {\
                        printf("%s\n", message);\
                        return 0;\
                        }
    
  • 今回の場合は、最後の } には \ もしくは ¥ をつけてはいけません。 そして mainmacro.c を次のように変更します。

    mainmacro.c

    
    #include <stdio.h>
    #include "mainmacro.h"
    
    MAIN("I am a main.")
        
  • コンパイルするには、次のように .c ファイルだけを指定します。複数の .c ファイル がある場合はカンマ , で区切って gcc aaa.c, bbb.c, ccc.c と入力します。
    
    gcc mainmacro.c
    
    ./a.out
    
    I am main.
        
  • mainmacro.h のように .h という拡張子の付いたファイルのことを 「ヘッダーファイル」と呼びます。
  • このヘッダーファイルは stdio.h と同じですが、< > で囲まれた ヘッダーファイルは処理系に付属しているヘッダーファイルです。 自分で作ったファイルは" と "の間にそのヘッダーファイルの位置を 相対パスで指定します。通常は .c ファイルと同じ場所にあるものとして、" " の間にはヘッダーファイル名のみを記述します。

  • enum

    enum.c

    
    #include <stdio.h>
    
    enum DERECTION
    {
        LEFT    = 100,
        TOP     = 200,
        RIGHT   = 300,
        BOTTOM  = 400,
    };
    
    int main()
    {
        printf("%d\t", LEFT);
        printf("%d\t", TOP);
        printf("%d\t", RIGHT);
        printf("%d\n", BOTTOM);
        
        return 0;
    }
        

    実行結果

    
    100	200	300	400
        

    コード説明

    1. enum の定義は
      enum 名前 { 個別の名前 = 値, 個別の名前 = 値, ... };
      と記述します
    2. 個別の名前のことを「列挙子」と呼びます。
    3. 列挙子には、整数の初期値を設定できます。整数以外は設定できません。
    4. 整数であれば、0 や -1 なども設定できます。 違う列挙子に同じ値を設定することもできます。
    5. enum の定義後は、列挙子の値は変更できません。
    6. GTK では、列挙子や定数やマクロの名前に、GTK_WINDOW_TOPLEVEL や GTK_ORIENTATION_VERTICAL と言うように先頭に GTK がついている場合が多いです。
    7. \t はエスケープ文字です。\t はタブ文字として扱われます。


    列挙子に、初期値が与えられない場合は、0からの連番になります。

    enum2.cpp

    
    #include <stdio.h>
    
    enum DERECTION
    {
        LEFT    ,
        TOP     ,
        RIGHT   ,
        BOTTOM  ,
    };
    
    int main()
    {
        printf("%d\t", LEFT);
        printf("%d\t", TOP);
        printf("%d\t", RIGHT);
        printf("%d\n", BOTTOM);
        
        return 0;
    }
        

    実行結果

    
    0	1	2	3
        


    最初の列挙子や、途中の列挙子に、特定の値を設定すると、次の列挙子は、その値の +1 になります。

    enum3.cpp

    
    #include <stdio.h>
    
    enum DERECTION
    {
        LEFT    = 100,
        TOP     ,
        RIGHT   = 200,
        BOTTOM  ,
    };
    
    int main()
    {
        printf("%d\t", LEFT);
        printf("%d\t", TOP);
        printf("%d\t", RIGHT);
        printf("%d\n", BOTTOM);
        
        return 0;
    }
        

    実行結果

    
    100	101	200	201
        


    enum もファイルを分けることができます。

    enum.h

    
    enum DIRECTION
    {
        LEFT    = 100,
        TOP     ,
        RIGHT   = 200,
        BOTTOM  ,
    };
        

    enum.cpp

    
    #include <stdio.h>
    #include "enum.h"
    
    int main()
    {
        printf("%d\t", LEFT);
        printf("%d\t", TOP);
        printf("%d\t", RIGHT);
        printf("%d\n", BOTTOM);
        
        return 0;
    }
        

    実行結果

    
    100	101	200	201
        


    GTKの定数

    GTK には、いろいろな定数があらかじめ定義されています。 もし、GTK をインストールしていた場合は、次のサンプルも試すことができます。

    gtk_constant.c

    
    #include <gtk/gtk.h>    // gtk/gtk.hにはstdio.hも含まれています
    
    int main()
    {
        printf("FALSE is %d\n", FALSE);
        printf("TRUE  is %d\n", TRUE);
        printf("HBOX  is %d\n", GTK_ORIENTATION_HORIZONTAL);
        printf("VBOX  is %d\n", GTK_ORIENTATION_VERTICAL);
        printf("RAND_MAX %d\n", RAND_MAX);
        
        return 0;
    }
        

    このコードをコンパイルするには、次のようにコマンドします。

    
    gcc gtk_constant.c `pkg-config --cflags --libs gtk+-3.0
        

    実行結果は次のようになります。

    
    FALSE is 0
    TRUE  is 1
    HBOX  is 0
    VBOX  is 1
    RAND_MAX 2147483647
        
    1. FALSE は条件に合っていないという意味です。 Cでは 0 は条件に合っていないと評価されます。
    2. TRUE は条件に合っているという意味です。 Cでは 0 以外は条件に合っていると評価されます。
    3. GTK_ORIENTATION_HORIZONTAL は横向きという意味ですが、 実際には数値の 0 です。
    4. GTK_ORIENTATION_VERTICAL は縦向きという意味ですが、 実際には数値の 1 です。
    5. RAND_MAX は乱数を作る時に使用する定数です。 この定数には macOSとLinuxでは 2147483647 (約21億)、Windows では 32767 が設定されています。


    2070 visits
    Posted: Dec. 23, 2019
    Update: Dec. 23, 2019

    ホーム   C/C++チュートリアル   目次