Typedef参数和函数

时间:2016-11-29 10:53:38

标签: c function 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的类型不是可以传递给printme的参数类型。 printme期望km_ph类型,或至少char类型。我得到以下输出:

                    9
 0        111
 d        100

为什么会这样?

2 个答案:

答案 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  

see

这就是为什么在你的项目中使用某种静态代码分析器总是好的。

答案 1 :(得分:1)

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

void f(char ch) { }

int main() { f(100.09); }

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

正如其他评论/答案中所提到的,某些编译器的开关会为这些转换生成警告消息。