2

NSLog をベースとして使用し、 PRETTY_FUNCLINEを追加する方法について、多数のマクロのバリエーションを見つけましたが、それらのマクロのすべてのバリエーションは単に結果をコンソールに出力するだけです。

可変数の引数を持つフォーマットを取り、メソッドの名前とそれが呼び出された行番号を追加してから NSString を返すことができるマクロが欲しいのですが、これまでのところ、コンパイラは私が呼び出した場所に常に文句を言います. 私の最新バージョンは次のとおりです。

#define FileLog(format, ...) {\
return [NSString stringWithFormat:@"\n  %s [Line %d] \n       %@",
__PRETTY_FUNCTION__,
__LINE__,
[NSString stringWithFormat:(format), ##__VA_ARGS__]];\
}

コードから呼び出すたびに、コンパイラは次のいずれかのエラーを生成します。

error: expected expression before '{' token

ログクラスを作成したり、そのためのフレームワークを使用したりしたくありません。マクロでそれを行う方法が必要ですか?誰?

前もって感謝します!

4

3 に答える 3

8

これはマクロで完全に可能です。マクロについてもう少し背景が必要だと思います。

まず、マクロは関数ではないため、中括弧は不要です (実際、これがエラーの原因です)。マクロは、プリプロセッサが理解できる構文を使用して自動化された、かなりばかげた「コピー/貼り付け」です。

複数の行にまたがって NSString を「その場で」作成するマクロを定義するには、次のようにバックスラッシュで改行をエスケープする必要があります。

#define FileLog(format, ...) \
    [NSString stringWithFormat:@"\n %s [Line %d] \n %@", \
    __PRETTY_FUNCTION__, \
    __LINE__, \
    [NSString stringWithFormat:format, ##__VA_ARGS__]]

マクロは、関数のように「戻る」わけではありません。前述のとおり、マクロは単にテキストを「コピー/貼り付ける」方法に過ぎないからです。

次のように使用できます。

int num = 42;
NSLog(@"%@", FileLog(@"some number: %d", num));

プリプロセッサの出力 (プリプロセッサがコンパイル前に作成するファイル) を見ると、上記の例は次のように展開されます。

NSLog(@"%@", [NSString stringWithFormat:@"\n %s [Line %d] \n %@", __PRETTY_FUNCTION__, __LINE__, [NSString stringWithFormat:@"some number: %d", num]]);
于 2012-04-17T22:03:06.500 に答える
2

これを試して....

インクルード ファイルを作成する

#define LOG_NOLOG_LEVEL 0
#define LOG_ERROR_LEVEL 1
#define LOG_WARN_LEVEL 2
#define LOG_INFO_LEVEL 3
#define LOG_DEBUG_LEVEL 4


#if LOG_HELPER_LEVEL >= LOG_DEBUG_LEVEL
    #define LOGDEBUG(...) {[LogHelper log:[NSString stringWithFormat:__VA_ARGS__]];}
#else
    #define LOGDEBUG(...)
#endif

#if LOG_HELPER_LEVEL >= LOG_INFO_LEVEL
    #define LOGINFO(...) {[LogHelper log:[NSString stringWithFormat:__VA_ARGS__]];}
#else
    #define LOGINFO(...)
#endif

#if LOG_HELPER_LEVEL >= LOG_WARN_LEVEL
    #define LOGWARN(...) {[LogHelper log:[NSString stringWithFormat:__VA_ARGS__]];}
#else
    #define LOGWARN(...)
#endif

#if LOG_HELPER_LEVEL >= LOG_ERROR_LEVEL
    #define LOGERROR(...) {[LogHelper log:[NSString stringWithFormat:__VA_ARGS__]];}
#else
    #define LOGERROR(...)
#endif

次に、次のように単一のクラス メソッドを使用して単純なクラス LogHelper を作成します。

+ (void) log:(NSString *)message
{
    fputs([message cStringUsingEncoding:NSUTF8StringEncoding], stderr);
}

次に、コードに次のような呼び出しを入れることができます...

LOGDEBUG(@"%s - %d Redirect response received\n%@",__FILE__,
                                __LINE__,[redirectRequest dumpInfo]);

LOG_HELPER_LEVEL を生成するログのレベルに設定できます。たとえば LOG_WARN_LEVEL にレベルを設定すると、INFO または DEBUG レベルのコードはアプリに含まれないため、アプリをリリース用にパッケージ化するのは簡単です。

お役に立てれば...

于 2012-04-17T22:11:42.017 に答える
0

私を訓練した私のiOSシニア開発者であるViraj Thenuwaraから:-)

このマクロは、上記のものよりも定義と使用法がはるかに単純です。

#define debug                   1

#if debug
    #define AppLog(fmt, ...)        NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
    #define AppLog(...)
#endif

そして、その使用法は次のとおりです。

 NSString *url = @"http://google.com";    
 AppLog(@"url %@ and id %d", url, 5);

このAppLog行は、デバッグ定数が 1 に等しい場合にのみ、指定された内容を出力します。本番時またはログ行を出力したくない場合はいつでも、その 1 を 0 に変えることで無効にできます。

コンソール出力は次のようになります。

ここに画像の説明を入力

これが他の誰かに役立つことを願っています! 乾杯!

于 2015-03-28T18:58:54.013 に答える