prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 11.29a

Q我的编译器拒绝了最简单的测试程序,并报告了各种各样的语法错误。它抱怨第一行是

	main(int argc, char **argv)
	{
		return 0;
	}


A可能是预 ANSI 编译器,无法接受函数原型等。

另请参阅问题 1.3110.911.3016.1b

如果您无法访问 ANSI 编译器,并且需要转换一些较新的代码(例如此列表中的代码),以便可以编译它,请执行以下步骤:

  1. 从函数原型声明中删除参数类型信息,并将原型样式的函数定义转换为旧样式。新样式声明
    	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。)
  2. 替换void *char * .
  3. 可能在“通用”指针(void *,您刚刚将其替换为char *)和其他指针类型之间转换时插入显式转换(例如,在调用mallocfree和在qsort比较函数中;请参阅问题 7.713.9)。
  4. 将“错误”数值类型作为函数参数传递时插入转换,例如sqrt((double)i);.
  5. 重写对realloc使用NULL0作为第一个或第二个参数的调用(请参阅问题 7.30)。
  6. 移除constvolatile限定符。
  7. 修改任何已初始化的自动聚合(请参阅问题 1.31)。
  8. 使用旧的库函数(请参阅问题 13.24)。
  9. 重写涉及###(请参阅问题 10.2010.2111.18)。
  10. 重写涉及#elif.
  11. 从以下设施转换:<stdarg.h><varargs.h>(请参阅问题 15.7)。
  12. 交叉你的手指。(换句话说,这里列出的步骤并不总是足够的;可能需要更复杂的更改,而这些更改没有被任何 cookbook 转换所涵盖。)

可以通过预处理器而不是通过编辑源代码来执行许多这些更改。

另请参阅 Rationale 的“静默更改”列表(请参阅问题 11.2)。

另请参阅问题 11.31


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管