你會期望這個程式產生結果

2021-07-27 06:23:14 字數 1443 閱讀 2192

你會期望這個程式產生結果:

3和4的總和是:7

但事實上,它根本不編譯!visual studio 2005 express產生以下編譯錯誤:

新增.cpp(5):錯誤c3861:'新增':未找到識別符號

新增.cpp(9):錯誤c2365:「新增」:重定義;以前的定義是「以前未知的識別符號」

此程式未編譯的原因是編譯器按順序讀取檔案。當編譯器為函式的呼叫()對main()線6,不知道什麼補充的是,因為我們還沒有定義()到10號線!產生第乙個錯誤(「未找到識別符號」)。

當visual studio 2005到10線()實際的宣言,也抱怨將被重新定義。這是有點誤導,因為它從來沒有定義在首位。visualstudio的後版本正確地省略此附加錯誤訊息。

儘管第二個錯誤的冗餘,它是有用的注意,這是相當常見的乙個單一的錯誤產生(往往是多餘的)多個編譯器錯誤或警告。

規則:在解決程式中的編譯錯誤時,總是首先解決第乙個錯誤。

要解決這個問題,我們需要解決的事實,編譯器不知道什麼是新增。有兩種常見的方法來解決這個問題。

選項1:排序函式呼叫,所以()定義在main():

234

5678

9#include int add(int x, int y); // forward declaration of add() using function prototype

int main()

這樣,通過時間main()()呼叫,編譯器會知道什麼是()。因為這是乙個簡單的程式,這種變化相對容易做。然而,在乙個更大的程式,它可以是乏味的試圖找出哪些函式呼叫哪些其他功能(以何種順序),以便它們可以被順序宣告。

此外,這個選項並不總是可能的。假設我們正在編寫乙個程式,它有兩個函式a和b。如果函式是乙個呼叫函式b,函式b呼叫函式a,那麼就沒有辦法在函式中排序,它們都會很高興。如果你定義了第乙個,編譯器會抱怨它不知道b是什麼。如果你先定義b,編譯器會抱怨它不知道是什麼。

函式原型和函式的前向宣告

選項2:使用前向宣告。

前向宣告允許我們在實際定義識別符號之前告訴編譯器關於識別符號的存在。

在函式的情況下,這允許我們在定義函式的主體之前告訴編譯器關於函式的存在性。這樣,當編譯器遇到對函式的呼叫時,它會理解我們正在做乙個函式呼叫,並且可以檢查以確保我們正確地呼叫函式,即使它還不知道該函式是如何或在何處定義的。

為函式編寫乙個前向宣告,我們使用乙個宣告語句,稱為函式原型。函式原型包括函式的返回型別、名稱、引數,但沒有函式體(卷括號之間的一部分)。因為函式原型宣告,它以分號結束。

int add(int x, int y) // defines function add()

int x; // instantiates (causes memory to be allocated for) an integer variable named x

你絕對想不到的程式輸出結果

1.第一題 include include include using namespace std int main 簡直不敢相信,程式會輸出4321,你知道為什麼嗎?要知道為什麼,你需要知道printf的返回值是什麼。printf返回值是輸出的字元個數 2.第二題 include include ...

為什麼這個程式中sizeof的結果是4

為什麼這個程式中sizeof的結果是4?include include using namespace std class base sizeof a 4 你問的實際就是這個問題.不知道你了不了解c 多型的實現方式?看沒有看過一本書 裡面講的很清楚.當乙個類中有虛函式存在時,編譯器為自動為我個類加上...

你應該首先保護哪些應用程式 這個問題本身問錯了

如果貴企業與大多數企業一樣,那麼it環境中可能有數百個 乃至數千個應用程式。它們極有可能是在過去10年或20年編寫 更新和打上補丁的。你可能對那些應用程式並沒有做好足夠到位的安全工作。要說有什麼可以讓你稍稍寬慰,那就是我們採訪的每個人其實處境一模一樣。在人們不知不覺當中,安全這筆債很快會堆積如山。起...