LoginSignup
37
43

More than 5 years have passed since last update.

Objective-CやCのプリプロセッサ(マクロ)のメモ

Last updated at Posted at 2014-01-29

マクロの入れ子(ネスト)

マクロで指定した数値などをそのまま文字列定数としたい場合などです。

#define ANY_NUM 1

#define _HOGE(str) #str
#define HOGE(str) _HOGE(str)
static NSString *const kSomeString = @"hoge" HOGE(ANY_NUM) @"foo";

// => "hoge 1 foo"

#は引数をそのまま文字列として展開する演算子です。

Prefixなどのマクロ

#define Prefix(str) @"Prefix" str

どうやら、@""は連続して書くことで連結されるよう。

NSString *test = @"This " @"is " @"test";
NSLog(@"%@", test); //=> "This is test"

「##」トークンの結合

sample.m
#define HOGE(a) tes##a

NSString *test = @"sample text.";
NSLog(HOGE(t));

HOGE(t)のところが「tes」と連結され、「test」となり、結果sample text.が出力される。

「…」可変引数

__VA_ARGS__で参照できる。

sample.m
#define HOGE(…) NSLog(__VA_ARGS_)

HOGE(@"---%@---", @"test text."); //=> ---test text---

「hoge, …」可変引数

こちらも可変引数。ただ、最初の引数はhogeに渡され、以降の引数が__VA_ARGS__に入る。

#ifdef HOGE

HOGEシンボルが定義されているか確認する。

sample.m
#ifdef HOGE
    //HOGEが定義済
#else
    //HOGEが未定義
#endif

#ifndef HOGE

ifdefの逆。未定義の場合に「真」になる。

#if

ifdefがシンボルの定義判定だったのに対し、こちらは式を評価する。

sample.m
#if 式1

#elif 式2

#else

#endif

#pragma

pragmaはホストマシンやオペレーティングシステム固有のを使う・・ものらしい。まだしっかり調査してません。

即定義マクロ

最初から定義されているマクロ。

識別子 意味
__FILE__ ソースファイル名
__LINE__ 行番号
__DATE__ コンパイル日時
__TIME__ コンパイル時間
__STDC__ ANSI規格対応ならば1、ANSI規格非対応ならば0
37
43
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
43