Запятая внутри оператора внутри макроса неверно интерпретируется как разделитель аргументов макроса - PullRequest
1 голос
/ 21 июля 2011

Я только что создал проект XCode и написал следующий код:

#define foo(x) x
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    int n = 666;
    NSString* string = foo([NSString stringWithFormat: @"%d", n]);
    NSLog (@"string is %@", string);
    [self.window makeKeyAndVisible];
        return YES;
}

Когда я пытаюсь запустить это, я получаю кучу ошибок, потому что препроцессор решает, что эта запятая после stringWithFormat: isпредполагается, что он разделяет два аргумента макроса, поэтому я использовал foo с двумя аргументами вместо правильного.

Итак, когда я хочу запятую внутри оператора внутри моего макроса, что я могу сделать?

Этот вопрос C ++ предлагает способ поставить несколько круглых скобок () вокруг запятой, что, очевидно, заставляет препроцессор понять, что запятая не является разделителем аргументов макроса.Но, черт побери, я не думаю о том, как это сделать в цели C.

Ответы [ 3 ]

5 голосов
/ 21 июля 2011

Добавление дополнительных скобок вокруг вызова работает:

NSString* string = foo(([NSString stringWithFormat:@"%d",n]));
0 голосов
/ 21 июля 2011

Попробуйте NSString * string = foo ([NSString stringWithFormat: (@ "% d", n)]);

В противном случае попробуйте метод Картера, который прекрасно работает.

0 голосов
/ 21 июля 2011

Отделение это работает, но может быть более простой способ

NSString* stringBefore = [NSString stringWithFormat:@"%d",n];
NSString* string = foo(stringBefore);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...