Определение макроса в файле PCH с предупреждением - PullRequest
1 голос
/ 25 августа 2011

В моем файле PCH есть следующий макрос.

#ifdef DEBUG
    #define MYLOG(...) NSLog(__VA_ARGS__)
#else
    #define MYLOG(...) MYSERVERLOG(MYObject.enableLogging, __VA_ARGS__)
#endif

#define MYSERVERLOG(iLog, ...) iLog ? NSLog(__VA_ARGS__) : TRUE

Теперь, независимо от того, положил ли я DEBUG = 0 или DEBUG = 1, он всегда указывается в первом предложении. Но если я использую «if» вместо «ifdef» для DEBUG в PCH, то это работает нормально, но тогда я получаю предупреждения на все мои операторы MYLOG, говорящие «Выражение результатов не используется».

Как мне избавиться от этой ситуации?

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Полагаю, вы получите предупреждение только если DEBUG = 0. Проблема в том, что после запуска препроцессора компилятор видит код, подобный следующему:

...
MYObject.enableLogging ? NSLog(@"your log",...) : TRUE;
...

Компилятор может позволить вам игнорировать результаты функции, предполагая, что функция сделала все, что вы хотели, и результат бесполезен. Однако, когда вы сталкиваетесь с проблемой вычисления значения в вашем коде с помощью троичного оператора, он ожидает, что вы захотите получить результат этого вычисления. Если вы знаете, что никогда не будете использовать результат этого макроса, вы можете разыграть его как void, чтобы игнорировать его:

#define MYSERVERLOG(iLog, ...) ((void)(iLog ? NSLog(__VA_ARGS__) : TRUE))

Если вы можете использовать результаты макроса, то вам придется выполнять приведение при каждом использовании макроса и игнорировать результат или жить с предупреждениями. В этом случае вы все равно должны ставить скобки вокруг макроса, чтобы избежать возможных проблем.

#define MYSERVERLOG(iLog, ...) (iLog ? NSLog(__VA_ARGS__) : TRUE)
1 голос
/ 25 августа 2011

если вы делаете

#define DEBUG 0

ИЛИ если вы делаете

#define DEBUG 1

, макрос "DEBUG" определен так ...

#ifdef DEBUG 

всегда будет истинным, так как DEBUG определен.

Если вы хотите войти во 2-е предложение, вам нужно убедиться, что макрос не определен как AT ALL (т.е. удалить макрос или закомментировать его). ** 1012

...