comp.lang.c FAQ 列表·
问题 11.29a
Q我的编译器拒绝了最简单的测试程序,并报告了各种各样的语法错误。它抱怨第一行是
main(int argc, char **argv)
{
return 0;
}
A可能是预 ANSI 编译器,无法接受函数原型等。
另请参阅问题 1.31、10.9、11.30 和 16.1b。
如果您无法访问 ANSI 编译器,并且需要转换一些较新的代码(例如此列表中的代码),以便可以编译它,请执行以下步骤:
- 从函数原型声明中删除参数类型信息,并将原型样式的函数定义转换为旧样式。新样式声明
extern int f1(void);
extern int f2(int);
int main(int argc, char **argv) { ... }
int f3(void) { ... }
将被重写为 extern int f1();
extern int f2();
int main(argc, argv) int argc; char **argv; { ... }
int f3() { ... }
(注意“窄”类型的参数;请参阅问题 11.3。) - 替换void *为char *
.
- 可能在“通用”指针(void *,您刚刚将其替换为char *)和其他指针类型之间转换时插入显式转换(例如,在调用malloc和free和在qsort比较函数中;请参阅问题 7.7 和 13.9)。
- 将“错误”数值类型作为函数参数传递时插入转换,例如sqrt((double)i);.
- 重写对realloc使用NULL或0作为第一个或第二个参数的调用(请参阅问题 7.30)。
- 移除const和volatile限定符。
- 修改任何已初始化的自动聚合(请参阅问题 1.31)。
- 使用旧的库函数(请参阅问题 13.24)。
- 重写涉及#或##(请参阅问题 10.20、10.21 和 11.18)。
- 重写涉及#elif.
- 从以下设施转换:<stdarg.h>与<varargs.h>(请参阅问题 15.7)。
- 交叉你的手指。(换句话说,这里列出的步骤并不总是足够的;可能需要更复杂的更改,而这些更改没有被任何 cookbook 转换所涵盖。)
可以通过预处理器而不是通过编辑源代码来执行许多这些更改。
另请参阅 Rationale 的“静默更改”列表(请参阅问题 11.2)。
另请参阅问题 11.31。
关于此 FAQ 列表 关于 Eskimo 搜索 反馈 版权由
托管