c объявление функции в xcode / для замены NSLog чем-то, что ведет себя по-разному при отладке и выпуске - PullRequest
4 голосов
/ 28 июня 2011

Это довольно глупый вопрос!но как использовать оставшиеся аргументы в следующей функции:

void NSLog(NSString *format, ...)
{
    //here I can use "format" but how can I use the remaining arguments?
}

Трудно найти ответ на этот вопрос, потому что я не могу найти "..."?!Кстати, так работает NSLog, но я привожу его здесь в качестве примера, мой вопрос не имеет ничего общего с NSLog.

Ответы [ 4 ]

5 голосов
/ 28 июня 2011

Использовать список аргументов переменной:

void NSLog(NSString *format, ...)
{
    va_list ap;
    va_start(ap, format);

    while( (value = va_arg(args, NSString *) ){
        // Do something with value. This is assuming they are all strings
    }

    // or pass entire list to another function
    NSLog_VA( format, ap );

    va_end(ap);
}

void NSLog_VA( NSString * format, va_list args )
{
    // do something with va_list here
}

Редактировать: Поскольку вы хотите журнал только для отладки:

#ifdef DEBUG 
#define DebugOnly_Log(format, args...) NSLog(format, ##args) 
#else 
#define DebugOnly_Log(format, args...) // defined to nothing
#endif 
4 голосов
/ 28 июня 2011

Посмотрите на stdarg.h

Это может выглядеть примерно так -

void NSLog(NSString *format, ...)
{

  va_list args;
  va_start(args,format);
  vprintf([format cString], args);
  va_end(args);
}
3 голосов
/ 28 июня 2011

Это называется переменная функция , и вы можете получить доступ к ее аргументам, используя макросы в stdarg.h .

0 голосов
/ 28 июня 2011

ОК, спасибо всем, я следовал указаниям, которые вы мне дали, и вот решение: насколько я понимаю, не существует общего / переносимого решения проблемы получения переменного числа аргументов и передачи их другой функции, которая принимаетпеременное число аргументов (как уже упоминалось: http://c -faq.com / varargs / handoff.html ).

Но я хотел реализовать альтернативу NSLog (я называю это AliLog)во время отладки только ведет себя как NSLog, но для версии выпуска ничего не делает (или делает что-то кроме записи в consol).

вот мое решение:

void AliLog(NSString *format, ...) 
{
#ifdef DEBUG
    va_list args;
    va_start(args, format);
    NSLogv(format, args);
    va_end(args);
#else
    // do nothing! or something that makes sense in a release version
#endif
}

Магия в NSLogv здесь.

...