Условный макрос #define для функции, вызывающий: «function» переопределенное предупреждение - PullRequest
3 голосов
/ 02 февраля 2011

Я только что видел этот поток, описывающий, как добавить условные макросы: Условное значение для # define

, но в моем случае я определяю функцию в условии.

#if TARGET_IPHONE_SIMULATOR

#define doSomething(){\
    \\ does something
}\

#else

#define doSomething(){\
    \\ does something else
}\

#endif

Это работает, за исключением того, что я заставляю компилятор gcc выдавать это предупреждение:

"doSomething" redefined
This is the location of the previous arguments

Есть ли обходной путь, помогающий избавиться от предупреждений?

ОБНОВЛЕНИЕ:

Поэтому я попытался включить условие в мое определение:

#define doSomething(){\

#if TARGET_IPHONE_SIMULATOR
    \\ do something
#else 
    \\ do something else
#endif

}\

, но это выдает ошибку:

error: '#' is not followed by a macro parameter.

Ответы [ 4 ]

6 голосов
/ 16 февраля 2011

Я нашел ответ на свой вопрос здесь .

Вывод: вы не можете включить #ifdef и т. Д. ... внутри #defineпотому что в каждой строке должна быть только одна директива предварительной обработки.

Так что, хотя мы можем разбить строку обратной косой чертой '\', это помогает писать читаемые многострочные макросы, но препроцессор будет видеть ее как одну строку:

#define doSomething(){ #if TARGET_IPHONE_SIMULATOR ... #endif }

Что выдает эту ошибку:

error: '#' is not followed by a macro parameter.

Это имеет смысл, поэтому мне придется пересмотреть мою реализацию.

1 голос
/ 03 января 2015

Кроме того, это может быть связано с полученной ошибкой:
# и ## имеют специальные цели внутри определений макросов. # используется для окружения макропараметра двойными кавычками. ## используется для объединения двух макропараметров. Пример:
#define ABC(X) #X
ABC(hello) приводит к "hello".
#define XYZ(X,Y) X##Y
XYZ(O,K) приводит к OK. Обратите внимание, что эта функция (возможно) уникальна для ANSI C.
Кроме того, зачем вам использовать такой макрос? Может ли функция работать лучше для вас?

1 голос
/ 15 февраля 2011

В вашем мышлении есть причуда, которая по аналогии / продолжению. doSomething () должен рассматриваться как функциональный макрос. Как таковое, его определение амбивалентно. Уменьшить и увидеть ниже:

doSomething() {
#if TARGET_IPHONE_SIMULATOR
   // conditionally compiled code
#else
   // platform-specific code
#endif
}
0 голосов
/ 31 января 2014

Один из вариантов, который следует рассмотреть, - это создание в макросе условия, которое разрешается во время компиляции.Рассмотрим следующее:

Если я хотел бы вызвать другую функцию, основанную на значении 'c', в качестве действия препроцессора, я могу определить макрос, который статически проверяет значение 'c'.

#define AorB(c) ((c>0) ? (Do_A(c)) : (Do_B(c)))

Затем, если вы настроите уровень оптимизации, который удаляет ветви, которые никогда не будут доступны, он должен исключить тот случай, который никогда не выполнялся.Это может быть не совсем то, что вы искали.

...