寫給學弟的,其他飛過.:
1.int i;
2.int i = 0;
3. extern int i;
第一種,你可以認為它是定義也可以認為它是聲明, 這是不同編譯器決定的, 但是大部分都是聲明, 只有當給i進行賦值時才會真正定義.認為它是聲明.會告訴編譯器我這個符號已經預定了, 在這塊作用域內不允許第二個符號 .
第二種,自然是定義了,i會告訴編譯器,我已經綁定到這塊內存上了,其它變量不能占用這塊內存,除非出棧後,一個變量或對象在一定的區域內只能被定義一次,所以如果你重復定義一個變量, 會給你error,告訴你重復定義了!
{
int i = 0;
int i = 1;
}
w1.c: In function ‘main’:
w1.c:6:13: error: redefinition of ‘i’
w1.c:5:13: note: previous definition of ‘i’ was here
第三種,任何編譯器都會認為它是聲明!
可以簡化成: 定義創建了名字, 並且在這個作用域保持唯一, 並且為這個名字開辟內存, 聲明沒有分配內存 只是告訴你有這個符號了. 下面可能會用到, 不然會告訴你未聲明 .
摘自 Crazybaby's blog