2017-03-27 10 views
2

私は次のコードでLogger.hを持っている:'のva_startは'

LogDebug(@"Name is called with flag: %@", collectName ? @"YES" : @"NO"); 

は、しかし、私はエラーを取得する:として

#import <Foundation/Foundation.h> 
#import <asl.h> 

#define LogDebug(format, ...){ \ 
    Logger(ASL_LEVEL_DEBUG, format,##__VA_ARGS__); } 



#define Logger(LEVEL,format, ...) \ 
    LogLocal(LEVEL,format,##__VA_ARGS__); 

#define LogLocal(LEVEL, format, ...) \  
    va_list arg_list; \ 
    va_start(arg_list, format); \ 
    // ...\ 
    va_end(arg_list); \ 

Iがobj-Cからコールログ

'va_start' used in function with fixed args

この問題を解決するにはどうすればよいですか?

EDIT 1:

私も呼び出そう:AFLogLocal(LEVEL,format,...); - 同じエラーに

EDIT 2:

を私はasl_logを削除し、NSLogと交換しますならば - それは動作します:

#define LogLocal(LEVEL,format, ...) \ 
NSLog((@"XXX: %s " format), __PRETTY_FUNCTION__, ##__VA_ARGS__); 

EDIT 3

クレジット@Amin Negm-Awadに、として.mファイル内の関数でLogLocalを置き換え:予想通り

void LogLocal(int level, NSString *format, ...){ 

    va_list arg_list; 
    va_start(arg_list, format); 
    va_end(arg_list); 
    NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arg_list]; 
    asl_add_log_file(NULL, STDERR_FILENO); 
    asl_log(NULL, NULL, (level), "XXXX: %s", [formattedString UTF8String]);  
} 

作品。

答えて

3

拡張されたマクロを使用します。しかし、彼らは拡張のスコープや呼び出しを作成しません。それは簡単なテキストの置換です。

// Somewhere in a function 
void f(void) 
{ 
    … 
    LogDebug(@"Name is called with flag: %@", collectName ? @"YES" : @"NO"); 
    … 
} 

これは、このようなものを最後に展開されます:

// Somewhere in a function 
void f(void) 
{ 
    … 
    // LogDebug(@"Name is called with flag: %@", collectName ? @"YES" : @"NO"); 
    va_list arg_list; 
    va_start(arg_list, @"Name is called with flag: %@"); 
    // ... 
    va_end(arg_list); 
    … 
} 

f()は何vargsを取らないので、何もvargsはありません。それはLogLocal()機能ではなく、マクロを作るために役立つかもしれない

void LogLocal(int level, NSString *format, ...); 

実装:あなたの編集2へ

void LogLocal(int level, NSString *format, ...) 
{ 
    va_list arg_list; 
    va_start(arg_list, format); 
    // ... 
    va_end(arg_list); 
} 

はい、これは動作しますが、あなたが行うので、 argリストに触れるのではなく、argsをvargsを取る関数に渡します。しかし、そのトリックは必要ありません。代わりにLogLocal()を関数にすると、エラーなしでNSLog()と同様に呼び出されます。

関連する問題