【问题标题】:Error: Pasting formed with invalid preprocessing token错误:使用无效的预处理令牌形成粘贴
【发布时间】:2018-05-01 09:20:20
【问题描述】:

我有以下代码。

#define GOTO_RC(row,col) "\033["#row";"#col"H"
#define DISPLAY_WRITE(row, col, fmt, args) printf(GOTO_RC(row,col)  ## fmt, ## args)

在 example.c 中我正在尝试使用它。

DISPLAY_WRITE(24,1,"Command:",12);

我在 ARM-MDK 工具中遇到以下错误 [在此处输入图片描述][1] [1]:https://i.stack.imgur.com/33MN1.jpg 错误:粘贴形成的 ')"Command:"',一个无效的预处理令牌 [-Winvalid-token-paste] 错误:粘贴形成的 ',12',无效的预处理令牌 [-Winvalid-token-paste]

【问题讨论】:

    标签: c arm concatenation pasting


    【解决方案1】:

    由于您只想连接两个字符串,请去掉DISPLAY_WRITE 中的##。彼此相邻的两个字符串文字会自动连接。 ## 用于将两个标记连接在一起,然后将它们再次解释为标记,而不是字符串文字。

    此外,不完全相关,但如果您希望能够采用多个“args”,您将需要对可变参数宏的支持(大多数相关的东西都支持它们),并执行以下操作:

    #define DISPLAY_WRITE(row, col, fmt, ...) printf(GOTO_RC(row,col) fmt, __VA_ARGS__)
    

    【讨论】:

    • 感谢您的回复。
    • 感谢您的回复。如果我没有任何要打印的论据,我该如何处理。像 DISPLAY_WRITE(1,2,"Error")。我想保持参数部分是可选的。我试过#define DISPLAY_WRITE(row,col, fmt, ...) printf(GOTO_RC(row,col) fmt VA_OPT__(,) __VA_ARGS)。虽然我得到了预期的错误'('。我试图了解正在发生的事情。
    • 我锻炼了。 #define DISPLAY_WRITE(row, col, fmt, ...) printf(GOTO_RC(row,col) fmt, ##__VA_ARGS__)。为您的帮助干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多