2012-03-21 5 views
0

Я создал собственный класс ведения журнала, который регистрирует определенные вещи в файле. Я пытаюсь сделать макрос, чтобы я мог использовать свой пользовательский класс так же, как NSLog(), но он, похоже, не работает правильно.Пользовательский макрос регистрации не принимает несколько аргументов

Вот как я определяю макрос:

#define ECLog(fmt, ...) [ECLogger logText:fmt, ## __VA_ARGS__] 

logText: объявлен как это:

+ (void)logText:(NSString *)theString; 

Если бы я только передать один аргумент, он отлично работает. Как это:

ECLog(@"test"); 

Но если я прохожу еще один аргумент, как это:

ECLog(@"test %@",someString); 

Я получаю сообщение об ошибке, что он только ожидает один аргумент.

Любые идеи?

+0

Вы получаете эту ошибку о вызове метода, а не макросе, не так ли? Как объявляется 'logText:'? –

+0

Да, о макросе. Я обновил свое сообщение, показывая, как объявлен «logText:». – edc1591

ответ

2

Нет, предупреждение о вызове метода. Кажется, что ошибка связана с макросом, потому что вы просматриваете код до того, как препроцессор работал над ним, но компилятор указывает на одну и ту же строку, после обработки.

Вы объявили этот метод как один аргумент, но вы передаете его больше, чем это.

ECLog(@"test %@", someString); 

перезаписывается препроцессором:

[ECLogger logText:@"test %@", someString]; 

Вот дословный текст, который теперь передается компилятору, так же, как если бы вы набрали его таким образом себя. Метод объявляется как взятие одного NSString, но вы передаете ему две вещи. Вам необходимо изменить декларацию метода:

+ (void) logText: (NSString *)theString, ...; 
+0

ОК, что заботится об ошибке, но как объединить все аргументы в один 'NSString' в моем методе' logText: '? – edc1591

+0

Как вы это делали раньше? Разве вы не обрабатываете аргументы как 'va_list' внутри' logText: '? –

+0

Нет, я просто взял 'theString' и записал его в файл. – edc1591

Смежные вопросы