[英]Will function pointers always initialize to NULL?
我正在使用MSVC,看起來下面的代碼沒有崩潰,編譯器將函數指針初始化為NULL。
int (*operate)(int a, int b);
int add(int a, int b)
{
return a + b;
}
int subtract(int a, int b)
{
return a - b;
}
int main()
{
if(operate) //would crash here if not NULL
{
cout << operate(5,5);
}
operate = add;
if(operate)
{
cout << operate(5,5);
}
operate = subtract;
if(operate)
{
cout << operate(5,5);
}
return 0;
}
所以似乎MSVC將函數指針初始化為NULL,但如果我在Linux上的gcc上構建它也會為NULL嗎? 它是常規的還是MSVC特定的,無論我走到哪里,我都可以依賴它嗎?
謝謝
operate
初始化為NULL,因為它是一個全局變量,而不是因為它是一個函數指針。 如果沒有給出初始化,則具有靜態存儲持續時間的所有對象(包括全局變量,文件級static
變量和函數中的static
變量)初始化為0或NULL。
[編輯回應Jim Buck的評論:]在C ++中,這由語言標准的第3.6.2 / 1條保證,它開始於:
具有靜態存儲持續時間(3.7.1)的對象應在任何其他初始化發生之前進行零初始化(8.5)。 使用常量表達式進行零初始化和初始化統稱為靜態初始化 ; 所有其他初始化是動態初始化 。
我希望C的行為也是如此,因為C ++在大多數情況下都是與它兼容的,盡管我沒有它的標准。
[編輯#2]正如Jeff M在評論中指出的那樣,重要的是要意識到自動存儲持續時間的變量(即“普通”局部變量) 不會自動進行零初始化:除非給出初始化,否則它們是通過構造函數賦值,它們最初將包含隨機垃圾(無論已經存在於該位置的內存中)。 因此,初始化所有變量是一個好習慣 - 它不會傷害但可以提供幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.