1. 在使用VC時為什麼編譯時沒有錯誤,連接時有錯誤,不能打開文件
我們通常所說的編譯其實包含兩個部分:編譯和鏈接。
編譯是指把程序源文件編譯成目標文件,即vc下的.o文件。
鏈接是指把目標文件生成可執行文件。
鏈接的時候,如果某個函數只有聲明,但沒有實現,或者依賴第三方庫,但只提供了頭文件,沒有提供庫文件,或者庫文件的版本不對,都會導致鏈接錯誤,而這些錯誤,在編譯階段通常是不會報錯的。所以,你可以針對上面提到的幾點一一排除一下:
1,程序中所用到的自己寫的函數是否都已經實現;
2,如果使用了第三方庫,確認是否已經有了第三方庫,是否在工程設置中包含了庫文件,並且配置了庫文件搜索路徑,保證編譯器能找到所需要的庫文件;
3,如果使用了第三方庫,確認所使用的庫文件版本是對的。
如果上面這些都做好,基本上就不會有問題了。
2. c語言中在兩個文件中命名了相同的變數名,在內存中會不會讀取錯誤
如果在不同的c文件中定義了同名的全局變數,則它們會佔用相同的內存空間,而且編譯鏈接時不會報錯!
這可以參考全局變數的內存初始化順序,對於局部變數而言,內存分配的順序和代碼的順序是一樣好慶的。全局變數就不一樣了;一般的編譯器,
(1) 對於初始化的全局變數,碰到之後就知道這是一個定義,會馬上分配空間,
(2) 對於沒有初始化的全局變數,因為不知道是定義還是聲明,所以要在掃描完所有代碼之後才能決定,這個時候編譯器會讀符號表,然後看哪些變數沒有分配空間.
(3)不同源文件間全局變數的初始化順序:對於全局變數而言,除了在同一個文件定義的全局對象的初始化 是按照定義次序來進行的之外,其他全局或友戚握靜態變數之間的初仔源始化次序沒有任何保障的。
3. vc6寫書上的程序,編譯不報錯,無法執行。錯誤為執行Link.exe出錯
既然題主提出了這個問題,說明題主的編程語言理論嚴重缺乏。
在C/C++中,我們一般認為有兩個階段(其實有很多): 編譯和鏈接。而題主所提供的圖表示的是一種鏈接錯誤,而不是編譯錯誤。
編譯錯誤: 存在語法錯誤,缺少某個頭文件等很明顯的錯誤,如果編譯錯誤都不能解決,就說明寫代碼那個人水平極低。編譯主要是針對某個具體模塊的。
鏈接錯誤:鏈接是主要針對多個模塊而言的。這個理論太多。我就舉個例子來說明:地圖上的長城與實際的長城,我們平時說去長城玩兒,這個長城指的是「虛」的,可以認為是地圖上的長城;但是真正的去長城玩兒的時候,你總不能再地圖上玩兒吧,肯定是「實際上的」長城。
下面回歸正題:
你這個代碼很顯然是編譯通過的,那麼鏈接沒通過說明你的模塊之間存在問題。你的代碼中調用了AVC,AverageValue這幾個函數。但是你能指出這幾個函數具體是怎麼做的么?具體定義又在哪兒啊?用長城的例子來說明:你只是地圖上的長城,但是玩兒的時候必須到實際的長城去玩兒啊。
具體解決辦法:
自己寫出這幾個函數的定義代碼,然後將這幾個函數符號,放到調用地方的前面。
4. Java什麼情況下強轉型 編譯不報錯,運行會報錯
向下強制轉型——把一個父類(或祖先類)引用強制轉換成一個子類(或孫類)引用,是不會發生編譯錯誤的。
但如果這個父類(或祖先類)引用實際引用(指向)的對象,不是一個子類(或孫類)對象,運行時就會拋出異常。
舉例來說,如果鳥類和狗類都是動物類的子類。
如果有一個動物類的引用a引用了一個鳥類對象,則此時將a強制轉換成狗類引用,就不會報編譯錯誤,但運行時會拋出類型轉換異常。
因為a這個裝動物的籠子,實際上關的是一隻鳥,而需要的動物是一隻狗。
5. c語言編程錯誤,編譯不報錯 連接就出錯了
報錯是因為以下兩個函數是未定義的。
他們不是C語帶知言的庫函數,而在提供的代碼中又找不到它們的定義,所以連接的時候就會報錯。
double power(double x,int n);
double fact(int n);
需要在代碼裡面蠢森消實現這兩個函數,也就是寫出這兩個函數的功能是如何通過代碼來實現的
在原來的代碼後面加上以下代碼就可以了:
doublepower(doublex,intn)
{doubleans=1;
while(n--)
春扮ans*=x;
rerutnans;
}
doublefact(intn)
{doubleans=1;
if(n>0)
do{
ans*=n;
while(n-->0);
returnans;
}