## оператор в C не вставляет, как ожидалось - PullRequest
0 голосов
/ 11 июня 2019
struct ms {
        uint64_t a;
        uint64_t b;
        uint64_t c;
        uint64_t d;
};
#define MS_INC(ms, name) ms->##name++

...
struct ms m;
MS_INC(&m, a);

Это дает мне ошибку: "вставка" a "и" ++ "не дает действительный токен предварительной обработки"

Разрешено ли вставлять `-> 'или'. '

1 Ответ

2 голосов
/ 11 июня 2019

Это дает мне ошибку: "вставка" a "и" ++ "не дает действительный токен предварительной обработки"

И это правильно. И C не позволяет использовать оператор вставки токенов таким образом.

Похоже, вы хотите создать выражение вида

ms->name++

Обратите внимание, что он состоит из четырех токенов: ms, ->, name и ++. Если ваша операция вставки токена была выполнена, когда макро-аргумент, соответствующий name, фактически имел форму идентификатора, скажем Mark, то результатом был бы один токен ->Mark (между двумя другими). ->Mark не является действительным токеном.

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

ms -> name ++

или как это:

ms->name ++

или как это:

ms /* look, Ma, a comment! */
    ->name
  ++

Насколько я могу судить, ваш макрос абсолютно не нуждается в вставке токена. Просто удалите ##.

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