@blog.justoneplanet.info

日々勉強

C言語のプリプロセッサ

プリプロセッサによりある種の言語仕様が与えられる。

■ファイルのインクルード

以下のようにすると、自身のファイルの場所から探索が始まる。

#include "filename"

以下のようにすると、コンパイラの規則に従った探索が行われる。stdio.hなどは以下の方法でインクルードする。

#include <filename>

■マクロ

#define NAME VALUE

NAMEとVALUEは任意であり以下のようにすることもできる。

#define forever for(;;)

以下のようにすることで使用できる。

int main (int argc, const char * argv[])
{
    forever
    printf("hogehoge\n");
}

永久にhogehogeが表示される。また、以下のように関数を定義することもできる

#define max(a, b) (a > b)? (a) : (b)

int main (int argc, const char * argv[])
{
    int d = max(1, 2);
    printf("こんにちは!%d円よこしてください\n", d);
}

内部では以下のようにインライン展開されている。

x = ((p + q) > (r + s))? (p + q) : (r + s);

以下のような場合は注意する必要がある。

#define sq(x) x * x

int main (int argc, const char * argv[])
{
    int z = 3;
    sq(z + 1);// 7 = z + 1 * z + 1 = 3 + 1 * 3 + 1
    sq((z + 1));// 16
}

以下のようにすることで正しい結果が期待できる。

#define sq(x) (x) * (x)

■未定義

以下のようにして未定義にすることができる。

#undef hello

void hello() {}

■条件付き取り込み

以下のようにすることで条件に応じた処理をすることができる。

#if !defined(INCLUDED_MAIN)
define INCLUDED_MAIN

int hoge();

#endif

インクルードガードとかでも使う。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment