我有一個簡單的問題,但它使我煩惱。我的在線教科書說這是真的 - >「函數聲明在函數定義之前啓用對函數的調用。」我認爲這是錯誤的,因爲如果一個函數只有在聲明後才被調用,那麼程序如何知道它的功能。我想這會導致編譯時錯誤。有人能解釋爲什麼這是真的嗎?謝謝。關於函數聲明和原型的困惑
回答
這意味着一旦你聲明瞭這個函數,編譯器就會知道它的存在。
因此,您可以編寫代碼,調用該函數和編譯器不會抱怨。這可能就是爲什麼你的教科書上說在函數定義之前啓用了對該函數的調用。
當然,您必須然後定義某處的函數(寫入函數的主體)爲程序正確執行。
該文本並不意味着聲明足以讓它工作,它只是聲明聲明該函數允許編寫調用它的代碼,而沒有定義到位。
我現在看到非常感謝你解釋它。 – Flower
某些語言的某些編譯器在代碼中首次引用時需要知道函數的簽名。
如果沒有原型,程序員必須在函數被引用之前編寫函數的定義。這將使兩個功能不可能相互呼叫。
原型爲編譯器提供了函數的簽名,該函數將稍後寫入(定義)在代碼中,或者可能在不同的代碼文件中。
當聲明被給出時,那麼函數已經可以被代碼用於編譯。稍後,可以驗證和編譯函數的定義。
在運行時,函數的調用者(基於聲明)鏈接到定義。在Java中
例
在Java中的接口的方法可被看作是聲明:
和實施的方法中,這是在接口聲明的類,作爲定義:
public class HelloWorld implements IHelloWorld {
@Override
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
當另一個類在接口中使用該方法時,它有足夠的信息來完成彙編。在運行時,它需要獲得一個實現接口的具體類的實例。
這同樣適用於一個抽象類,它包含一個方法聲明:
public abstract class AbstractHelloWorld {
public void sayHello(String name);
}
具體類會是什麼樣子:
public class HelloWorld extends AbstractHelloWorld {
@Override
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
你的書中描述了我們所說的向前宣言。
前向聲明是程序員尚未給出完整定義的標識符(表示實體,如類型,變量,常量或函數)的聲明。
如果你把一個函數聲明,就意味着告訴編譯你的函數將如何看起來像(函數簽名),這樣就可以在你的代碼中調用它,但編譯器還不知道這個函數實際上做了什麼。
用C例
hello.h - 函數定義
void helloWorld();
hello.m - 函數聲明
void helloWorld() {
printf("Hello World");
}
這就是爲什麼你的理由如果您想要打電話,請包含.h文件那裏的功能。
例的目標C
// I promise you (the compiler) that a class called MyClass exists
@class MyClass;
@interface MyInterface : NSObject {
MyClass *evenThoughItDoesNotExistYet;
}
@end
「隱」 向前聲明
一些其他語言,如紅寶石內部做到這一點提前聲明。爲了實現這一點,他們多次掃描代碼以列出所有函數,然後驗證代碼中調用的所有函數是否存在。
- 1. 關於Javascript構造函數和原型的困惑
- 2. 困惑於JavaScript構造函數和原型
- 3. 關於java構造函數的困惑
- 4. 關於recusive函數的困惑
- 5. 關於python遞歸函數的困惑
- 6. 關於onclick函數的困惑
- 7. 關於cvSplit函數的困惑
- 8. 關於可重入函數的困惑
- 9. 關於構造函數的困惑
- 10. 關於varchar數據類型的困惑
- 11. 關於回聲的困惑「{$ a [0] ['download']}」
- 12. 關於仿函數有點困惑嗎?
- 13. 非原型函數聲明
- 14. 函數原型聲明
- 15. eclipse中令人困惑的關於包和導入關鍵字的聲明
- 16. 關於JavaScript數據類型和對象類型的困惑
- 17. 困惑於getchar()函數
- 18. 關於返回函數和Monad的困惑
- 19. 關於Python函數和列表的困惑
- 20. 關於PyClass_Check和PyClass_IsSubclass函數的一些困惑
- 21. 關於自定義數據類型和Haskell的困惑
- 22. Task.Factory.StartNew - 關於池的困惑
- 23. 關於MutationObserver的困惑
- 24. 關於objc_getClass的困惑
- 25. 關於DBus的困惑
- 26. 關於AverageTimer32 PerformanceCounter的困惑
- 27. 關於Thread.Join的困惑
- 28. 關於MusicService的困惑
- 29. 關於結構的困惑
- 30. 關於memset的困惑
是否涉及特定語言? – Verhagen