2012-06-25 98 views
2

我曾在一個名爲variables.h像這樣一個頭文件中定義的一些變量的extern:全局變量編譯器錯誤

#ifndef VARIABLES_H 
#define VARIABLES_H 


extern int var1; 
extern int var2; 

#endif 

然後我把它添加到我的源文件。

編譯器警告我說以下內容:

error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘var1’ 

這正好爲每個變量,並在最後一個變量結束。

什麼問題?

這個錯誤出現在variables.h中的每個變量上。

file.h:

#ifndef FILE_H 
#define FILE_H 

void do_sth(void); 

void do_sth_else(void); 

#endif 

file.c:

#include "variables.h" 

/* Quit */ 
void do_sth(void) { 
/* do sth */ 
} 

void do_sth_else(void) { 
/* do sth else */ 
} 

多數民衆贊成。 錯誤是:

error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘var1’ 

error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘var2’ 
+1

你可以在'.c'文件中加入這個文件並編譯嗎? –

+6

您帖子的標題很好。最可能的原因是在其他標題中。我的第一個猜測是你在這個之前包含另一個.h文件,而在另一個.h文件中,你聲明瞭一個沒有結尾分號或大括號的'struct'。 – dasblinkenlight

+0

如果我刪除包含完整函數的.c文件,並用它編譯好的完整函數替換頭文件中的函數原型。 – Rrjrjtlokrthjji

回答

1

一個與您發佈的頭明顯的問題是,它們在聲明的類型可能不是範圍內的變量。例如,你聲明

extern GtkLabel *status_label; 

但沒有

#include <gtk/gtk.h> 

在你的文件的頂部。當您包含main.cvariables.h時,您應該沒問題,因爲<gtk/gtk.h>包含在variables.h之前。在所有其他文件中,您將遇到問題,因爲GtkLabel是未知類型。

要解決此問題,請在variables.h文件的頂部包含<gtk/gtk.h>。然後創建一個簡單的項目只用variables.h和一個簡單的main.c包括variables.h

的main.c

#include "variables.h" 

int main() { 
    return 0; 
} 

不斷添加缺少的頭,直到這個簡單的main.c編譯。然後將您的variables.h添加到實際項目中,問題應該消失。

+0

你是正確的,因爲當我更換gdbouble與雙它沒有顯示錯誤! :) – Rrjrjtlokrthjji

+0

它現在可以運行:)非常感謝 – Rrjrjtlokrthjji

+1

@Nick:您可能更喜歡簡單地轉發聲明'GtkLabel',因爲您只使用指向它的指針並且不需要該類型的實際定義。換句話說,不使用包含它的頭文件,而是在使用類型之前使用'class GtkLabel;'(或'struct GtKLabel',無論哪個都適用)。我喜歡在頭文件中包含儘可能少的文件,因爲包含頭文件的所有人都可以獲得其他所有內容,這可能也可能不是問題。 –