Поведение #define в c - PullRequest
       0

Поведение #define в c

3 голосов
/ 28 августа 2010
#define int_p int*
int_p p1,p2,p3; // only p1 is a pointer !

Может кто-нибудь объяснить, почему это так.

Ответы [ 3 ]

14 голосов
/ 28 августа 2010

#define - это просто текстовая подстановка. Код выше эквивалентен

int *p1, p2, p3;

так что только p1 является указателем. Вам нужно

typedef int* int_p;

вместо.

2 голосов
/ 28 августа 2010

Вместо того, чтобы думать об этом так:

int* (p1, p2, p3);

думай об этом так:

int (*p1), p2, p3;

Как и в случае, только символ со звездочкой перед ним становится указателем, а не все из них.

1 голос
/ 28 августа 2010

Две точки:

Препроцессор просто выполняет подстановку текста в исходном коде перед компиляцией;у него нет понимания типов или синтаксиса.После предварительной обработки линии

#define int_p int*
int_p p1, p2, p3;

расширяются до

int* p1, p2, p3;

, что подводит нас ко второй точке;в объявлении * связывается с ближайшим декларатором, а не с указателем типа;IOW, вышеупомянутое объявление анализируется как

int (*p1), p2, p3;

Пробелы не имеют значения;int* p1; анализируется так же, как int *p1; и int * p1;.

Если вы хотите объявить все три переменные в качестве указателей, у вас есть три варианта:

  1. Сделайте все вручную:
    
        int *p1, *p2, *p3;
    
  2. Используйте свой макрос, но используйте несколькообъявления
    
        int_p p1;
        int_p p2;
        int_p p3;
    
  3. Создайте синоним типа с помощью средства `typedef`:
    
        typedef int *int_p; 
        int_p p1, p2, p3;
    

В отличие от макроса препроцессора, typedef не является простой подстановкой текста;Компилятор в основном создает синоним для типа int *, и этот синоним можно использовать везде, где можно использовать int *.

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