2016-11-29 69 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有不同類型之間的隱式轉換 –