使用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
相关产品推荐
相关产品推荐

