You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GCC编译内联汇编代码报错:expected identifier or ‘(’ before string constant

解决GCC编译内嵌汇编代码的错误问题

错误原因分析

  • 第一行的extern "C"是C++专属语法,若用GCC编译C语言源文件(后缀为.c),编译器会将其判定为非法语法,直接触发报错。
  • 由于函数声明失效,后续调用my_fn时,编译器会认为该函数未声明,进而抛出隐式声明警告。

解决方案

方案1:以C++代码方式编译

将源文件后缀改为.cpp,或编译时通过-x c++参数指定编译语言:

g++ test.c -o test
# 或者
gcc -x c++ test.c -o test

此方法可让编译器正确识别extern "C"语法,代码能正常编译运行。

方案2:修改代码适配C语言规范

移除C++特有的extern "C",改用标准C语言函数声明:

extern long my_fn(long in); /* Prototype */

__asm__( /* Assembly function body */
"my_fn:\n"
"  mov %rdi,%rax\n"
"  add $100,%rax\n"
"  ret\n"
);

int foo(void) {
   return my_fn(3);
}

之后用GCC正常编译即可:

gcc test.c -o test

补充:这段汇编代码基于x86-64架构调用约定(用rdi传递首个参数,rax存储返回值),若在32位环境编译,需对应修改寄存器(如eax、ebx等),但当前报错与架构无关,仅为语言语法问题。

内容的提问来源于stack exchange,提问作者neubert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:34:54