Параметр макроса C / C ++, содержащий точку (оператор доступа к элементу) - PullRequest
0 голосов
/ 11 октября 2019

Как можно использовать в макросе C / C ++ параметр, содержащий точку (оператор доступа к члену)?

Пример:

#define M(obj,y) obj.y##x
struct S { struct {int x;} c; int x; };
S s;
s.c.x = 1;
s.x = 2;
M(s,)   // works, 2 (resolves to s.x)
M(s,c.) // error: pasting formed '.x', an invalid preprocessing token

Как можно сделать M(s,c.) для разрешения до s.c.x?

Спасибо за помощь!

1 Ответ

3 голосов
/ 11 октября 2019

Оператор вставки токена ## требует, чтобы его два операнда были действительными токенами предварительной обработки, и выдает один токен предварительной обработки. Он часто используется для объединения двух идентификаторов в один идентификатор.

То, что вы пытаетесь сделать, - это не вставка токенов. Вместо этого вы стремитесь создать выражения типа s.x или s.c.x, где часть x всегда представляет собой один токен. Следовательно, оператор ## не должен использоваться. Вместо этого вы можете просто сделать это:

#define M(obj, y) obj.y x

Когда вы пытаетесь использовать оператор ##, препроцессор пытается объединить последний токен в аргументе y с токеном x. В c. . является токеном, поэтому результатом является .x, который не является допустимым токеном. Скорее, .x действителен только как последовательность из двух токенов.

...