我有以下代码:
#include <stdio.h>
typedef char km_ph;
typedef double nnew;
int printme(km_ph b){
printf ("%c %d\n", b,b);
return 0;
}
int main() {
km_ph a = 'o';
nnew b = 100.09;
printme(9);
printme(a);
printme(b);
return 0;
}
我希望printme(b)
和printme(9)
抛出某种类型的警告或错误,因为b
的类型不是可以传递给printme
的参数类型。 printme
期望km_ph
类型,或至少char
类型。我得到以下输出:
9 0 111 d 100
为什么会这样?
答案 0 :(得分:3)
取决于编译器,在其上运行FlexLint会给出这一点(参见重要的原型强制)
FlexeLint for C/C++ (Unix) Vers. 9.00L, Copyright Gimpel Software 1985-2014
--- Module: diy.c (C)
1 #include <stdio.h>
2
3 typedef char km_ph;
4 typedef double nnew;
5
6 int printme(km_ph b){
7 printf ("%c %d\n", b,b);
8 return 0;
9 }
10
11 int main() {
12
13 km_ph a = 'o';
14 nnew b = 100.09;
_
15 printme(9);
diy.c 15 Warning 534: Ignoring return value of function 'printme(char)' (compare with line 6)
_
16 printme(a);
diy.c 16 Warning 534: Ignoring return value of function 'printme(char)' (compare with line 6)
_
17 printme(b);
diy.c 17 Warning 524: Loss of precision (arg. no. 1) (double to char)
diy.c 17 Info 747: Significant prototype coercion (arg. no. 1) double to char
diy.c 17 Warning 534: Ignoring return value of function 'printme(char)' (compare with line 6)
18 return 0;
19 }
20
这就是为什么在你的项目中使用某种静态代码分析器总是好的。
答案 1 :(得分:1)
typedef
与此无关。这是一个更简单的例子:
void f(char ch) { }
int main() { f(100.09); }
从你的文字看来,好像你期望这应该是一个错误。但事实并非如此。浮点类型可以隐式转换为整数类型(char
是整数类型),结果是浮点值被截断为零。因此,ch
在此示例中变为100
,这就是您在程序中看到的内容。
正如其他评论/答案中所提到的,某些编译器的开关会为这些转换生成警告消息。