GCC中-D__USE_FIXED_PROTOTYPES__的作用及相关Makefile疑问
问题1:注释中的「correct headers」指什么?
在这本书出版的1997年,早期的C编译器(尤其是GCC)处理标准头文件时还有兼容性问题。像<stdlib.h>这类头文件,默认情况下可能只会提供旧式的无参数类型函数声明(比如malloc();),而非符合ANSI C标准的完整函数原型(比如void* malloc(size_t size);)。
__USE_FIXED_PROTOTYPES__这个宏的作用,就是强制这些头文件输出符合标准、带完整参数类型的函数声明——也就是注释里说的"correct headers",让头文件内容严格遵循ANSI C规范,这样编译器就能在编译阶段做参数类型检查,避免隐式声明带来的错误。
问题2:编译选项-D与__USE_FIXED_PROTOTYPES__之间无空格的原因是什么?
这是GCC支持的简写语法,-D后直接跟宏名(无空格)和-D加空格再跟宏名是完全等价的,都是用来在编译阶段定义预处理宏。比如-D__USE_FIXED_PROTOTYPES__和-D __USE_FIXED_PROTOTYPES__效果一模一样,只是作者选择了更紧凑的写法,属于个人习惯问题,没有特殊技术原因。
问题3:该宏曾用于获取malloc、free等函数原型,目前是否仍需使用?
完全不需要了。现代GCC(以及任何符合C99及后续标准的编译器),只要你正确包含<stdlib.h>这类标准头文件,就会自动提供malloc、free这些函数的完整原型。
而且__USE_FIXED_PROTOTYPES__本质是GCC的旧内部宏,现在已经被废弃,新版本GCC甚至可能忽略这个宏,或者触发编译警告。现在写C代码,只要遵循标准规范包含对应头文件,根本不需要手动定义这个宏。
问题4:过时的Makefile是否还需要.gcc后缀?
不需要。当年加.gcc后缀是为了区分针对不同编译器的Makefile(比如针对Sun编译器的makefile.sun),但现在的惯例是直接用Makefile或者makefile作为默认文件名,GNU Make会自动识别并使用它。
如果需要适配不同编译环境,现在更推荐在同一个Makefile里用变量或者条件判断来处理,而非用不同后缀的文件。保留.gcc后缀反而需要手动指定Makefile(比如make -f makefile.gcc),不符合现代使用习惯。
内容的提问来源于stack exchange,提问作者Ssuching Yu

