Как мне делать разные вещи для каждого значения макроса? - PullRequest
2 голосов
/ 29 сентября 2011
#define TYPE char *

if TYPE is char *
  do A
if TYPE is int
  do B

Есть ли пример, как делать такие вещи?

Ответы [ 5 ]

2 голосов
/ 29 сентября 2011

C препроцессор MACROS манипулирует текстом, поэтому он по существу не содержит типов, поэтому НЕТ, вы не можете этого сделать.

1 голос
/ 29 сентября 2011

Вы можете связать с ним другой символ:

#define TYPE char *
#define TYPE_IS_CHAR_STAR

#ifdef TYPE_IS_CHAR_STAR
...
#endif

Вам просто нужно поддерживать их согласованность вручную.

Обратите внимание, что это опасный макрос;Вы должны использовать typedef вместо этого.С помощью макроса:

TYPE x, y;

x - указатель, но y - нет.

0 голосов
/ 29 сентября 2011

Это сработало бы, если бы вы просто использовали базовые типы (поскольку они просто строки - см. Ответ Митча).Но как только вы попытаетесь использовать указатели, это больше не будет работать - звездочка бросает препроцессор в цикл:

[holt@Michaela ~]$ gcc test.c
test.c:3:10: error: operator '*' has no right operand

Но если вы хотите делать разные вещи, основанные на разных типах, яЯ собираюсь рекомендовать перейти на C ++ и использовать шаблоны и шаблон специализации .Неохотно, поскольку синтаксис шаблона невероятно уродлив, но вы должны иметь возможность делать все, что захотите.

Надеюсь, это поможет!

0 голосов
/ 29 сентября 2011

не легко.Вы могли бы сделать что-то вроде:

#define TYPE_IS_CHARPTR
//#define TYPE_IS_INT

#ifdef TYPE_IS_CHARPTR
    do A
#endif
#ifdef TYPE_IS_INT
    do B
#endif

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

С перечисляемыми константами и встроеннымифункций, в настоящее время нет необходимости в таком использовании.

0 голосов
/ 29 сентября 2011

Подобный эффект можно получить, определив другой макрос вместе с типом и используя #ifdef и т. Д. С этим другим макросом. Например:

#define TYPE char *
#define TYPE_IS_PCHAR 1

... потом позже ...

#ifdef TYPE_IS_PCHAR
   do A
#endif
#ifdef TYPE_IS_INT
   do B
#endif

Это не совсем то же самое, но оно все равно приводит вас туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...