2014-04-21 49 views
1

從我的C++教材函數原型和參數強制

函數原型的一個重要特徵是參數強制 - 即,迫使參數由參數聲明中指定適當的類型。例如,即使函數原型指定了一個 雙重參數,程序也可以調用具有整數參數的函數 - 該函數仍然可以正常工作。

所以我tryied

#include <iostream> 

// void foo(double); 

void foo(double a) { 

    std::cout << sizeof(a) << std::endl; 
} 

int main (void){ 

    int a = 1; 
    std::cout << sizeof(a) << std::endl; 
    foo(a); 

    return 0; 
} 

或沒有原型正確打印頭4然後 (內部功能)8.

是我的編譯器會檢查函數定義缺少 原型(可能不是嚴格的C++標準,但 也有用)或者我錯過了某些東西?

+0

這裏有什麼困惑? 'main'中有'int','foo'中有'double';他們是不同的大小(在您的平臺上)。 –

+0

我的混淆來自我的教科書聲明,因爲我沒有使用原型 –

+3

我認爲混淆是關於'prototype'這個詞。您將'prototype'理解爲'declaration',但'prototype'是函數的簽名,並且在這裏,您在函數的'definition'中直接定義了'prototype',並且之前的'declaration'是無用的。 – AntiClimacus

回答

2

一切都如它應該在這裏。考慮你在撥打sizeof時輸出的內容。您正在輸出變量的大小。現在,您必須瞭解的是,當您將a傳遞給函數foo時,a已隱式轉換爲doubledoubleint具有相同的值,但它們是不同的類型。 int的大小爲4個字節,double的大小在您的體系結構上爲8個字節。

基本上,當你的教科書說編譯器會強制參數給參數聲明指定的適當類型時,它的意思是它會查看你的int a,並找到它將作爲一個double(它將是4 in兩種情況)。編譯器這樣做是因爲它看到功能foo需要double,但foo正在獲得int。它不會改變主要功能中a的類型。 amain始終是inta在您的foo函數始終是double

請參閱:http://en.cppreference.com/w/cpp/language/implicit_cast 有關隱式轉換的更多信息。

+0

添加到此。 'static_cast < double >',而不是隱式轉換(上演),會使編譯器理解上演,因此沒有抱怨。這種明確的上演,將解決警告。 – parasrish

1

這裏實際發生的是編譯器意識到foo需要一個double參數,並將int參數轉換爲double。輸出顯示double在這個特定的系統中是8個字節,並且int是4個字節 - 兩者都是非常普通的。請注意0​​中的amain中的a不同。即使他們被稱爲同一事物,他們也是不同的東西。

1

函數foo實例化一個新的臨時值,也恰好被稱爲a,它是使用傳遞給它的int的double類型。然後,您正在打印這個新的臨時雙面的大小。大小爲8,因爲在您的平臺上,雙數是8.