Специальный параметр #define в C - PullRequest
0 голосов
/ 02 мая 2019

У меня есть структура A такая, что A имеет поля v0 и v1. Существует массив A:

A St[3];

Я бы хотел определить B так:

#define B[x] St[x].v0 

Я не могу вставить x в качестве параметра для определения. Есть ли способ сделать это в C? Моя цель - иметь возможность заменить каждый экземпляр St [x] .v0 на B [x].

Ответы [ 3 ]

2 голосов
/ 02 мая 2019

В соответствии с ссылкой C определение #define равно

#define <identifier>[( parameters, ... )] [replacement-list]

Вы не должны использовать квадратные скобки в пределах <identifier> (см. стандарт C99 ) и поэтому предложенное вами решение не будет должным образом обработано препроцессором.

Вместо этого будет работать

#define B(x) St[x].v0 // note the brackets

, где вы будете передавать дополнительные параметры в макрос (используя скобки),Однако это запутает ваш код и, скорее всего, запутает пользователей / читателей вашего кода.См. Также , почему вы должны быть осторожны с макросами .

2 голосов
/ 02 мая 2019

Макрос, который заменяет параметры, называется функционально-подобным макросом, а стандарт C предусматривает только функциональные макросы с использованием скобок, а не скобок.

Вы можете использовать метод ниже:

#define B(x) St[x].v0 
1 голос
/ 02 мая 2019

Вы можете иметь

#define B(x) St[x].v0

муравей, а затем заменить каждый экземпляр St[x].v0 на B(x).

Боюсь, что это невозможно сделать с [], выдля этого нужна перегрузка операторов (как в C ++).

...