2

我正在尝试编写一个宏:

#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 )

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

4

2 回答 2

2

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

于 2012-06-26T09:18:59.040 回答
0

尝试使用通用串联宏可能:

#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 )
于 2012-06-26T09:24:35.730 回答