Macros 带有参数x的宏,输出$x和@x

Macros 带有参数x的宏,输出$x和@x,macros,c-preprocessor,Macros,C Preprocessor,我正在尝试编写一个宏: #define FCT( x ) fct( ($ ## x), (@ ## x).first_line, (@ ## x).first_column ) 宏的输出应如下例所示: FCT(2) --> fct( $2, @2.first_line, @2.first_column ) 不幸的是,这不起作用,@似乎会导致错误。使用C预处理器是否可以实现这一点 目前我正在使用此宏: #define FCT(x,y) fct( x, y.first_line, y.fi

我正在尝试编写一个宏:

#define FCT( x ) fct( ($ ## x), (@ ## x).first_line, (@ ## x).first_column )
宏的输出应如下例所示:

FCT(2) --> fct( $2, @2.first_line, @2.first_column )
不幸的是,这不起作用,
@
似乎会导致错误。使用C预处理器是否可以实现这一点

目前我正在使用此宏:

#define FCT(x,y) fct( x, y.first_line, y.first_column )
FCT($2,@2) --> fct( $2, @2.first_line, @2.first_column )

这是可行的,对我来说足够短,但我问我第一个宏是否有可能。

事实上,MSVC接受
$
作为标识符的有效符号。正如上面正确指出的,根据标准,这不应如此。
@
是一个预处理器运算符,通常应应用于宏的参数。不能将其用作标识符的一部分。您的输出是C程序吗?

尝试使用通用连接宏,可能:

#define CONCAT(a,b) CONCAT_(a,b)
#define CONCAT_(a,b) a##b
#define FCT( x ) fct( CONCAT($,x), CONCAT(@,x).first_line, CONCAT(@,x).first_column )

$
@
都不是普通C代码中的合法标记,那么您需要它做什么?它不会产生法律代码。如果您给出了错误消息,那就好了。我怀疑@不会粘贴到有效的预处理令牌,因为它在C++中没有任何意义。您想使用GNU m4吗?这是一种更强大的宏处理器。我使用flex/bison,在那里我必须使用$1、@1等。我不想使用其他预处理器。是的,错误是第行“不是有效的预处理令牌”。@strustmaster不,这是错误的。宏预处理器只能处理有效的预处理器令牌(C++标准中的2.5),随后将其转换为令牌(2.7)。无效的标记是一个错误。我知道并与嵌入式系统的C编译器合作,该编译器出于某种原因决定在
inline
和其他关键字前面加上
@
。这使得无法通过定义来删除它们。@dinfehur,用其他前缀替换
$
@
,这些前缀由有效的标识符字符组成(可能是
X
Y
)。我没有选择名称,我使用的是flex/bison。我必须为一个令牌写$1,为令牌的位置写@1。我不是Bison语法方面的专家,AFAIK Bison source不是用宏处理器处理的。Bison正在生成C代码。只有在C编译器(和宏处理器)启动之后。我的理解是,您不能在Bison级别上使用宏处理。另外,我有自己的LR发电机,类似于野牛。在我的系统中,语法源使用完整的C预处理器进行处理。你试过了吗?它当然不会欺骗GNU C预处理器生成无效的令牌:也不起作用,同样的错误:
粘贴“@”和“2”不会给出有效的预处理令牌。这似乎不适用于标准预处理器。