RHEL服务器编译C文件遇varargs.h相关错误,求解决方案
<varargs.h>相关错误的方案 先看看你遇到的编译错误:
将执行命令
$ gcc -c exsystem.c时出现如下编译错误:
从exsystem1.c:39引入的文件中:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include/varargs.h:4:2: error: #error "GCC no longer implements <varargs.h>."
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include/varargs.h:5:2: error: #error "Revise your code to use <stdarg.h>."
exsystem1.c: 在函数“ex_fprintf”中:
exsystem1.c:118: error: expected declaration specifiers before “va_dcl”
exsystem1.c:152: error: expected “=”, “,”, “;”, “asm” or “attribute” before “{” token...
其实编译器已经把原因说得明明白白——GCC 4.4.7早就不支持<varargs.h>这个老旧的头文件了,它是C语言早期处理可变参数的非标准实现,现在必须换成标准化的<stdarg.h>。下面是具体的修复步骤:
1. 替换头文件引用
把代码里所有的#include <varargs.h>直接改成#include <stdarg.h>,这是第一步必须做的。
2. 重构可变参数函数的写法
你代码里的ex_fprintf用了<varargs.h>专属的va_dcl语法,这在<stdarg.h>里是不被认可的,得改成标准写法。举个例子:
你现在的旧代码(大概是这个样子):
#include <varargs.h> void ex_fprintf(va_dcl) va_dcl { va_list ap; va_start(ap); // 你的函数逻辑 va_end(ap); }
修改为<stdarg.h>的标准写法:
#include <stdarg.h> // 先定义固定参数,用...标记可变参数部分 void ex_fprintf(FILE *stream, const char *format, ...) { va_list ap; // va_start需要传入最后一个固定参数的名字,这里是format va_start(ap, format); // 如果需要调用标准的可变参数包装函数,比如vfprintf,直接传ap就行 vfprintf(stream, format, ap); // 剩下的自定义逻辑 va_end(ap); }
这里要注意两个关键点:
<stdarg.h>要求可变参数函数必须至少有一个固定参数,va_start的第二个参数必须是最后一个固定参数的名称,用来确定可变参数在栈上的位置。- 如果你的
ex_fprintf原来没有固定参数,那得调整函数签名,添加必要的固定参数(比如输出流、格式字符串,这和标准库的fprintf设计一致)。
3. 重新编译
改完之后再运行gcc -c exsystem.c,这些编译错误应该就全部消失了。
内容的提问来源于stack exchange,提问作者keerthana

