我有一個.h文件,我打算只用於存儲將顯示在我的程序中的所有信息字符串。在我info.h:C鏈接錯誤多重定義
#ifndef __INFO_H
#define __INFO_H
char *info_msg = "This is version 1.0 of NMS.";
//all other strings used by view.c and controller.c
#endif
然後在我的view.h我有如下:
我或者Controller.h使用view.h:
//controller.h
#ifndef __CONTROLLER_H
#define __CONTROLLER_H
#include "view.h"
#include "model.h"
//other stuff line method declaration etc.
#endif
爲主。 c:
#include "controller.h"
int main()
{
//stuff
}
view.c:
#include "view.h"
char esc,up,down,right,left;
void change_character_setting(char pesc, char pup, char pdown, char pright, char pleft)
{
esc = pesc;
up = pup;
down = pdown;
right = pright;
left = pleft;
}
void print_warning()
{
printf("%s \n",info_msg);
}
當我試圖創建鏈接抱怨可執行文件:
/tmp/ccqylylw.o:(.data+0x0): multiple definition of `info_msg'
/tmp/cc6lIYhS.o:(.data+0x0): first defined here
我不知道爲什麼會看到兩個定義,因爲我使用的是保護塊。我試圖谷歌在這裏,但沒有具體顯示。有人可以解釋它是如何看到多個定義的?我如何在Java中實現簡單的操作,以便在C中使用單個文件進行所有文本操作?
切勿在頭文件中分配變量。在頭文件中聲明它們爲extern,並在源文件中定義它們。編譯器爲每個包含創建一個實例(例如,在每個編譯單元/源文件中)。這會在鏈接時創建錯誤。 – bash0r
謝謝。現在我收到以下錯誤:/tmp/ccFMbvlv.o:在函數'print_warning'中: view.c :(.text + 0x44b):未定義的引用'info_msg' – as3rdaccount
您可以編輯您的答案併發布view.c ? – bash0r