Q我遇到了一个令人沮丧的问题,结果是由以下一行引起的:
printf("%d", n);其中n实际上是一个long int。我认为 ANSI 函数原型应该可以防止此类参数类型不匹配。
A当一个函数接受可变数量的参数时,它的原型不会(也不能)提供关于这些可变参数的数量和类型的任何信息。因此,普通的保护机制对于可变长度参数列表的可变长度部分不适用:编译器无法执行隐式转换,或者(通常)警告类型不匹配。程序员必须确保参数匹配,或者必须手动插入显式转换。
在类似printf的函数的情况下,一些编译器(包括gcc)和一些版本的lint能够根据格式字符串检查实际参数,只要格式字符串是直接的字符串字面量。