Две точки:
Препроцессор просто выполняет подстановку текста в исходном коде перед компиляцией;у него нет понимания типов или синтаксиса.После предварительной обработки линии
#define int_p int*
int_p p1, p2, p3;
расширяются до
int* p1, p2, p3;
, что подводит нас ко второй точке;в объявлении *
связывается с ближайшим декларатором, а не с указателем типа;IOW, вышеупомянутое объявление анализируется как
int (*p1), p2, p3;
Пробелы не имеют значения;int* p1;
анализируется так же, как int *p1;
и int * p1;
.
Если вы хотите объявить все три переменные в качестве указателей, у вас есть три варианта:
- Сделайте все вручную:
int *p1, *p2, *p3;
- Используйте свой макрос, но используйте несколькообъявления
int_p p1;
int_p p2;
int_p p3;
- Создайте синоним типа с помощью средства `typedef`:
typedef int *int_p;
int_p p1, p2, p3;
В отличие от макроса препроцессора, typedef не является простой подстановкой текста;Компилятор в основном создает синоним для типа int *
, и этот синоним можно использовать везде, где можно использовать int *
.