多重定義項編譯原理
❶ 編譯原理問題
第一個問題:編譯時是否有影響無關緊要只是你的源文件變大了,但是執行起來是沒有影響的。
第二個:採用靜態全局變數是為了在連接多個文件時防止重名問題出現,因為程序員在編程時不會一個人完成一個較大程序,必需要分工,每個人都用自己的文件來寫程序,這樣在多個文件中可能會把名字起重了,比如在本文件中用static 類型 a定義後,a就只能是B文件的全局變數,這時A文件也可以用static 類型 a來定義,但是它僅限於A文件,當然如果你不把A文件和B文件合在一起就沒啥意義了,可以說如果B文件的執行結束了,這個靜態全局變數就被釋放了。
第三個:只要應用程序結束,變數就釋放了
第四個:開辟的空間放在內存中,也就是ram(隨機存取存儲器),你理解的對
❷ C++項目編譯錯誤:找到一個或多個多重定義的符號。。我覺得應該是include的問題,但是不知道怎麼改
確實是include的問題
因為錯得比較離譜,對於函數的定義、函數的聲明、函數的定義和聲明分開等等概念不清楚,所以建議還是專門找找這方面的資料,了解如何編寫多文件工程再來。
另:有個不正統的方法可以把你這個改得能編譯通過,把book.cpp和BData.cpp從工程中去掉(不是刪除文件)應該就沒問題了
❸ c++避免多定義或重定義
你好,最好的處理辦法是在工程的cpp文件里定義全局變數,然後在別的文件里不要包含。直接用
extern聲明就好了。比如extern int g_a;
❹ 多重嵌套宏定義有什麼好處
#define WIDTH 80 #define LENGTH (WIDTH+40) 在第二個宏定義中,使用了前面定義過的宏名WIDTH。在編譯預處理時,程序中所有的WIDTH都被80所替換,所有的LENGTH又被(80+40)替換
❺ c語言里系統總是說,有符號多重定義,怎麼找是哪個符號,選取下面的
一般編譯器會提示哪個符號被重定義。下面是VS2012環境編譯的情況。如果編譯器不指出,可以右擊變數,點擊轉到定義,看下是否多個地方定義。
❻ C語言編譯原理是什麼
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
❼ C語言編譯出現了 多重定義的符號 的報錯
同一個工程中創建了多個main函數
關閉當前工程,另建一個工程後重新編譯
❽ C++中兩個文件讀取一個.h時多個多重定義錯誤
從昨晚到現在查了很多東西,但結果卻超級簡單:
首先#include在編譯時會被預處理器將.h中的所有內容拷貝到當前文件中, 如果.h中還include了別的.h, 則遞歸拷貝;
如果.h文件中沒有頭文件保護,即#ifndef ... #define ... #endif則如果某文件include 1.h和 3.h, 而1.h也#include了3.h, 則會有完全相同的兩份3.h中的代碼, 這樣就直接報錯了; 但加入了頭文件保護後就可以保證在單一文件中只會編譯一遍3.h的代碼;
所以到目前為止如果加入了頭文件保護,在單一文件中不會有重聲明(定義),編譯可以通過,生成各個.o文件了, 頭文件中定義的變數都定義並分配了空間,就你的問題而言,tool.o中有Map, 同時main.o中也有Map;
然後就是鏈接了,此時會將各.o中的全局符號加入全局符號表中,如果.o中有相同的全局變數則會報重定義, 即tool.o和main.o中的Map沖突了。
總結下:頭文件保護只是保證在 單一文件中不會重復include, 但不保證在不同文件中重復include。
解決辦法為在.h中只聲明變數: extern map Map; 而在tool.cpp中定義: map Map;
多謝問題哈,終於搞清楚了這個問題!
❾ 關於編譯原理
可以自己寫一個JPanel或者JComponent的子類,然後在子類中重寫paint方法,在裡面繪制背景圖片。下面的部分是從我的代碼里截出來的,不保證這樣能用,只是給你個大體的絲路。學會了這個後自己重寫組件就方便多了 public class ChessBoard extends JComponent{ private Image screen = null; public void paint(Graphics g) { if (screen != null) { g.drawImage(screen, (width - BOARDWIDTH) / 2, (height - BOARDHEIGHT) / 2, this); } else { screen = ChessBoard.this.createImage(BOARDWIDTH,BOARDHEIGHT); } } }
❿ 編譯C程序出現多重定義,怎麼解決
應該是你在2個c文件中都定義了全局的MmiUtil_WaitKeyMenu,可以聲明為static,或者改個名字