マクロの入れ子(ネスト)
マクロで指定した数値などをそのまま文字列定数としたい場合などです。
#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 |