masalibの日記

システム開発、運用と猫の写真ブログです

【Objective-C】プリプロセッサが嫌い

Objective-Cの初心者の愚痴です。

Objective-C初心者の私が躓いたところです。
とあるプロジェクトをソースだけ引き継ぎをして自分で展開できるのかを確認していました
ソースしかないというアホみたいな状況ですが現実です。
お金をもらっているのでがんばらないといけないのですがマジでObjective-Cのプリプロセッサが嫌いです。

IFのネスト(入れ子)ができない

例

#ifdef USE_POPU_PMENU
    [self startPopup];
#else
#if (APP_TYPE != APP_TYPE_MAP)
    [self startLaunch];
#else
    [self performSegueWithIdentifier:@"secondView" sender:nil];
#endif /*  (APP_TYPE != APP_TYPE_MAP) */
#endif /* USE_POPU_PMENU */

クソ言語と呼ばれているvbですらifのネストができます。やり方があるのかもしれないけど見にくいです。 ネストできないところにインデントができるObjective-Cがあるのです。 上の例はまだわかりやすいですがMethodの途中にあるとカオス。

プリプロセッサのDEFINEが嫌い

DEFINEで定義したけど値が入っていないというパターンがあります

#define USE_IMAGE_POST

定義されているけど値が入っていない?? なにか入れてくれよ

さらにややこしいのがプリプロセッサで使えるように ターゲットの単位でもつことができます

例えば、以下のような形でpchがあります

#import "CommonDefine.h"

#ifndef ProjectX_pch
#define ProjectX_pch

#ifdef DS
#import "CommonDefine_DS.h"
#endif
#endif /* ProjectX_pch */

この#ifdef DSのDSってどこで設定されているの??
作った人が悪いのですがコメントすら書いていないので?? まじでわからん。しかもDSという短い文字。コメント書いてくれよ!!

色々調べた結果、この値はProjectファイルのターゲットにGCC_PREPROCESSOR_DEFINITIONSがあり そこで設定されています。

GCC_PREPROCESSOR_DEFINITIONS = (
    "DEBUG=1",
    "$(inherited)",
    DS,
);

GUIでは以下です

参考URL

https://qiita.com/edo_m18/items/126fe6561f662b86210e https://www.rk-k.com/archives/6031