【问题标题】:C preprocessor token substitution fails with parse errorC 预处理器令牌替换失败并出现解析错误
【发布时间】:2011-02-01 14:46:44
【问题描述】:

我在 C 程序中定义了以下宏:

#define ISE1  "cust_add"
#define ISE2  "cust_sub"

#define ise_inst(inst, a, b, c) \
asm volatile (
" " inst " %1, %2, %0          \n\t" \
: "=r" (c) \
: "r" (a), "r" (b) \
: "%g0" \
)

在主程序中,我使用以下参数调用宏:

ise_inst(ISE1, inp1, inp2, res);

理想情况下,预处理器应该扩展整个东西,以便我得到以下结果:

asm volatile (
" cust_add %1, %2, %0          \n\t"
: "=r" (res)            
: "r" (inp1), "r" (inp2)         
: "%g0"                                                   
); 

有人知道我做错了什么吗?目前预处理器告诉我

错误:在字符串常量之前解析错误(@ line: " " inst " %1, %2, %0 \n\t" )

【问题讨论】:

  • 您可能会考虑将问题更改为“C 预处理器令牌替换失败并出现解析错误”之类的问题。 “预处理器更换”这个问题听起来像是你想更换预处理器——我很确定我在过去几周内看到过类似的问题。

标签: c assembly c-preprocessor inline-assembly


【解决方案1】:

看起来您在asm volatile( 行之后缺少\ 行继续符。

【讨论】:

    【解决方案2】:

    除了缺少的\,你的汇编指令必须像这样被字符串化:

    #define ise_inst(inst, a, b, c)       \
    asm volatile (                        \
    " " #inst " %1, %2, %0          \n\t" \
    : "=r" (c)                            \
    : "r" (a), "r" (b)                    \
    : "%g0"                               \
    )
    

    注意inst 之前的小#。如果您随后使用ISE1 调用您的宏,这将扩展为"ISE1"

    【讨论】:

    • 谢谢大家,这对你们所有的 cmets 都非常有帮助。现在可以了!
    【解决方案3】:

    你没有忘记asm volatile ( 后面的反斜杠字符 (\) 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-05
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      相关资源
      最近更新 更多