在C++語言中,將函數原型放入main
或其他函數中是否合法?這是不好的做法嗎?爲什麼有人會把原型放在主體裏面?把函數原型放在main或者其他函數裏面是合法的嗎?
2
A
回答
2
是的,這是合法的 - 這是毫無疑問。不過,這通常不可取。
不可取的一個原因是該函數僅在該特定函數中可用(作爲該聲明的結果);同一個文件中的其他函數不能使用該聲明(但其他函數可能包含它們自己的函數聲明 - 但是然後你重複自己,這不是一個好主意)。
此外,您失去了交叉檢查的主要好處。做到這一點的最好辦法是:
- 如果功能是一樣的源文件中定義(和源文件外不使用),然後限制其範圍的文件(
static
或匿名命名空間,或在適當的其他命名空間),並確保它在使用之前被定義或聲明。 - 如果函數是在不同的源文件中定義的,則應該有一個聲明函數的頭文件。在定義函數的文件(以確保頭中的聲明與定義一致)以及使用該函數的文件中包含頭文件。
這樣,如果您需要更改函數聲明,則追蹤的位置更少。如果您在多個位置聲明函數,則必須一次更改所有聲明。當然,對於足夠徹底的更改(額外的參數或更少的參數),您將不得不修改對函數的調用;對於其他更改(例如,將一個const
限定符添加到參數或將值從傳遞值更改爲傳遞參考),您可能不需要更改源中的任何內容;一個簡單的重新編譯可能就足夠了。
5
很明顯,最好將原型放在自己的頭文件中;任何功能:)
然而之外,這是合法的:
#include <stdio.h>
int
main (int argc, char *argv[])
{
void foo();
foo();
return 0;
}
void foo()
{
printf ("Foo!\n");
}
相關問題
- 1. c或C++中main()函數的原型?
- 2. #include裏面的main()函數
- 3. 把Firebase.setAndroidContext()函數放在哪裏
- 4. 把js變量放在wordpress函數裏
- 5. 把sqldf放在r函數裏
- 6. 抑制與函數main函數調用的原型
- 7. 哪裏把gcc函數屬性放在自動函數中
- 8. `this`裏面的函數不是一個類的原型
- 9. 將javascript函數放入其他函數的正確語法
- 10. JavaScript *不是函數(原型函數)
- 11. 替代函數語法/函數原型?
- 12. 在Chrome中沒有將函數分配給其他函數的原型
- 13. Neo4j - 不能在聚合函數裏面使用聚合函數
- 14. 爲什麼你可以把一個函數原型放入函數中?
- 15. SQL窗功能無法在其他窗口函數或聚合
- 16. AVR C函數從Main函數工作,但不從其他函數
- 17. 把進口放在頂部?或者他們在哪裏使用?
- 18. 「......」 在函數原型
- 19. 其他聚合函數中的MySQL聚合函數
- 20. RxJS Observable:'跳過不是函數'(或任何其他函數)
- 21. 在$ watch函數裏面比較原始類型的錯誤
- 22. 如何在js中訪問這個裏面的原型函數
- 23. cocoa app main()函數在哪裏去?
- 24. 函數原型
- 25. 把 放在空的裏面好嗎?
- 26. 在父函數原型中使用原型的Javascript函數
- 27. this.toPaddedString不是函數原型
- 28. 如何「undeclare」函數原型或隱藏函數原型或#un包含標題
- 29. 在javascript中將函數放入其他空函數的目的是什麼?
- 30. 函數原型在主函數中?
相關:http://stackoverflow.com/q/6089452/46642 –