C語言中在一個函數中定義另一個函數是否可編譯並運行?
01-03
問題的起因是今天無意之中看到一段話
在C語言中規定在一個函數中定義一個函數是不可以的。
然後自己寫了個簡單的小程序驗證了一下。
#include &
int a()
{
printf("This is a();
");
int b()
{
printf("This is b();
");
}
return 0;
}
int main()
{
a();
return 0;
}
在CentOS中使用GCC 編譯器可以編譯通過並執行,但是當我在用VC去編譯的時候卻出錯。
難道是編譯器問題?
不解,望各位大俠為小弟解答一下,萬分感謝。
嗯這是GCC的Nested Functions擴展。
GCC在標準的C語言之上還實現了若干C擴展功能。用-pedantic編譯可以得到提示信息說使用了GCC擴展。用-std=c99、-std=c11之類的可以禁用這些擴展。Clang、ICC、MSVC之類的其它C編譯器都不支持這個nested function擴展。C的標準規定是不能內嵌函數定義的,gcc有擴展允許。
C++的話,你可以在函數里定義一個類,實例化之後調用它的函數。標準C說不可以,vc也說不可以,
gcc拓展功能有說可以,
強大的gcc可以不使用這些拓展功能,-ansi-pedantic具體的百度看看,我測試了一下,大家可以看一下:
環境: centos6.7 gcc 4.4.7
代碼:#includevoid f() { printf( "normal func" ); return ; }
int main()
{ void f() ;(測試時候手誤,所以結果是錯的。) { printf( "nested func" ); // (注釋1) return ; }
f();
// (注釋2) f(); printf( "main func
" );
}
結果:
nested funcnormal funcmain func去掉 注釋2 結果:
nested funcnormal funcnormal funcmain func去掉 注釋1 結果:
nested func我把你的代碼複製執行了,輸出結果是This is a(); 編譯器是tdm-gcc 4.8.1 64bit
gcc的擴展特性,所以VC不支持。
搜索引擎使用技術已經失傳了嗎?
當然不可以,未聲明函數原型,gcc能通過是什麼原因鬼曉得。。。。。
http://stackoverflow.com/questions/957592/functions-inside-functions-in-c
推薦閱讀:
※如何選購用於ArchLinux的筆記本?
※初學 Linux,應該看什麼書,從哪裡下手?有哪些可以自學以及交流的網站?
※同樣的代碼在windows平台和在Linux平台上運行結果不同?
※linux真的比windows更適合web開發者作為開發環境嗎?
※Linux 錄屏軟體有哪些?