C語言中在一個函數中定義另一個函數是否可編譯並運行?

問題的起因是今天無意之中看到一段話

在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

代碼:

#include

void f() { printf( "normal func
" ); return ; }

int main()

{

void f() ;(測試時候手誤,所以結果是錯的。)

{

printf( "nested func
" );

// (注釋1) return ;

}

f();

// (注釋2) f();

printf( "main func
" );

}

結果:

nested func

normal func

main func

去掉 注釋2 結果:

nested func

normal func

normal func

main 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 錄屏軟體有哪些?

TAG:Linux | C編程語言 | VisualC | 編譯器 |