亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 36964 | 回復(fù): 6
打印 上一主題 下一主題

關(guān)于“initializer element is not constant ”的編譯錯(cuò)誤 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-10-11 18:29 |只看該作者 |倒序?yàn)g覽
試驗(yàn)用的gcc版本比較老。

以下兩段代碼,如果命名為 *.c 文件,在GCC下編譯,都會(huì)報(bào)錯(cuò),錯(cuò)誤信息是“initializer   element   is   not   constant ”。

但是如果把 *.c 文件改名為 *.cc文件,用g++編譯,就不會(huì)報(bào)錯(cuò)。

誰能詳細(xì)解釋一下這是為什么。

// code 1
int i = 10;
int j = i + 4;


// code 2
int i = 10;
int main()
{
    static int j = i;
    retrun 0;
}

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
2 [報(bào)告]
發(fā)表于 2008-10-11 20:06 |只看該作者

回復(fù) #1 kiffa 的帖子

語言的規(guī)定不一樣唄

論壇徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辭舊歲徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
3 [報(bào)告]
發(fā)表于 2008-10-12 18:36 |只看該作者

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-10-12 21:12 |只看該作者
謝樓上的,這下弄清楚了。

在C++中對(duì)于以下語句:
// 全局域
int i = 3;
int j = i;

編譯時(shí)將i 放入.data 段,設(shè)置其值為3.

而對(duì)于j ,編譯器遇到這種語句,只知道j = i ,由于 i 是變量,不是常量,編譯器無法在編譯時(shí)直接得到它的值,編譯器只會(huì)找到i 的地址, 然后讀取這個(gè)地址的內(nèi)容,再把這個(gè)內(nèi)容寫入 j 的地址。

編譯器不能夠直接用3 來初始化 j ,因?yàn)橛?jì)算機(jī)不是人,不懂簡單的人類邏輯,我們想“因?yàn)?i = 3,而 j = i,所以j = 3",而計(jì)算機(jī)無法在邏輯上由i = 3 和 j = i 來推出j = 3,就好像圖靈機(jī)不可能證明某個(gè)論題的真?zhèn)我粯印?br />
計(jì)算機(jī)只會(huì)“取 i 的地址,把3 放到 i 的地址中,取 i 的地址,讀取這個(gè)地址中的內(nèi)容,取 j 的地址,把這個(gè)內(nèi)容 寫入j 的地址! 它不會(huì)思考,不懂因果,只是機(jī)械地執(zhí)行指令。編譯器無法在編譯時(shí)求得一個(gè)非常量的值,它只能在運(yùn)行時(shí)通過讀取變量地址來間接得到變量的值,而全局變量在編譯時(shí)就必須確定其值,故C有靜態(tài)存儲(chǔ)區(qū)數(shù)據(jù)必須用常量初始化的規(guī)定。

在編譯時(shí)只能用常量去初始化一個(gè)靜態(tài)存儲(chǔ)區(qū)的數(shù)據(jù),而不能用“讀取某個(gè)變量的內(nèi)容”來初始化,所以編譯器會(huì)將j 放入 .bss段,默認(rèn)值為0 ,然后添加一條語句在運(yùn)行時(shí)讀取i 的值,再賦給j。這條語句在調(diào)用main()之前完成。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-10-12 21:23 |只看該作者
一個(gè)對(duì)比:

對(duì)于語句:
int i = 3

int main()
{
    int j = i;
    ...
}

在編譯時(shí)不需要確定局部變量 j 的值,而是在運(yùn)行時(shí)讀取i 的值來賦給 j. 編譯連接后的可執(zhí)行文件中不會(huì)存放j 的值,只有相應(yīng)的賦值語句的代碼。與此相對(duì)的,由于i 是全局變量,存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),因此在編譯時(shí)其值就需要確定其值,在目標(biāo)文件中會(huì)分配空間來存放 i 的值,運(yùn)行時(shí)不會(huì)有賦值語句來給 i 賦值, 沒有對(duì)應(yīng)的代碼。

而對(duì)于語句:
int i = 3;
int j = i;

由于j 是全局變量,存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),因此也需要在編譯時(shí)確定其值。而i 是變量,不是常量,i 的值無法在編譯時(shí)確定,這就造成j 的值也無法在編譯時(shí)確定,所以C對(duì)此就會(huì)報(bào)錯(cuò)。而C++采取了另外一種做法,在編譯時(shí)簡單的把 j 作為未初始化的全局變量放入.bss 區(qū),其默認(rèn)值為0,然后添加一條語句在運(yùn)行時(shí)給 j 賦值,并保證這條語句在 main函數(shù)開始之前執(zhí)行。因此j 的初始化實(shí)際上實(shí)在運(yùn)行時(shí)完成的。

[ 本帖最后由 kiffa 于 2008-10-12 21:25 編輯 ]

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-10-13 09:10 |只看該作者
新版本的gcc能不能編譯通過呢?我覺得可以,因?yàn)槲医?jīng)常就是同時(shí)聲明和定義的,雖然不是全局或者static

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2014-05-22 10:28 |只看該作者
學(xué)習(xí)了。。。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP