G++编译含__attribute__关键字的C代码失败 GCC可正常编译
错误原因
这个编译错误和__attribute__关键字无关,根本原因是代码使用了C语言的K&R旧式函数定义语法:
- gcc是C语言编译器,默认兼容K&R语法,所以可以正常编译
- g是C编译器,C++标准从最初版本就不支持K&R风格的函数声明/定义,解析语法时会直接报错
你代码里的这段就是典型K&R风格定义:参数名写在函数括号里,参数类型单独声明在括号和函数体之间:
static __inline int student_information(stu) struct student *stu; { return 0; }
g++解析这段代码时,不会识别括号外的参数类型声明,会误把student_information(stu)判定为inline变量声明,后续的类型声明、函数体都会被判定为语法错误,也就是你看到的那一串报错。
修复方案
把K&R风格的函数定义改成C、C++通用的标准函数原型形式即可,不需要改动__attribute__相关代码,修改后的对应代码段为:
static __inline int student_information (struct student *stu) __attribute__((__unused__)); static __inline int student_information (struct student *stu) { return 0; }
修改完成后执行g++ test.c -o test即可正常编译通过。
如果不想修改原有C代码,也可以在编译时加-x c参数,强制g++按照C语言语法规则解析文件,对应命令为:g++ -x c test.c -o test
这种方式不需要改代码,但长期来看还是推荐把函数定义改成标准原型形式,跨编译器兼容性更好。
内容的提问来源于stack exchange,提问作者qwe123
相关产品推荐
相关产品推荐

