2016-11-29 71 views
2

我有以下的代码:的typedef参数和功能

#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类型不是可以传递参数的类型到printmeprintme预计km_ph类型,或至少char类型。我得到以下输出:

    9 
0  111 
d  100 

为什么会发生这种情况?

+0

启用所有推荐的警告! C并不妨碍你拍摄你的脚,但是现代编译器可以增强这种缺陷。 – Olaf

+4

@Olaf,没有帮助。或者我错过了一些? http://coliru.stacked-crooked.com/a/7a4f676d7809551e – StoryTeller

+0

关于“**所有**推荐警告”的含义尚不清楚?如何阅读你的编译器的文档? (你没有说明你使用的是哪一个!) – Olaf

回答

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 

see

这就是为什么它是一件好事,有某种静态代码分析仪在项目。

1

typedef与此无关。这里是一个更简单的例子:

void f(char ch) { } 

int main() { f(100.09); } 

从您的文本看来,好像你期望这应该是一个错误。但事实并非如此。浮点类型可能会隐式转换为整数类型(char是一个整数类型),结果是浮点值被截断为零。因此ch在此示例中变为100,这就是您在程序中看到的内容。

正如其他评论/回答中所述,某些编译器具有交换机,它们将为这些转换生成警告消息。

+0

但它们不是同一类型! – Fabulous

+0

另外,你如何解释'printme(9)'? 9,4字节,应该被截断为1字节,但不会发生。 – Fabulous

+0

@Fabulous C有不同类型之间的隐式转换 –