2017-06-23 68 views
0

我已經遇到了代碼意大利麪,我需要測量流量控制,即一次發送一個數據。我如何使用全局變量來解決這個問題?如果全局變量不起作用,訪問和修改可能處於不同類別的多個函數中的變量的方法是什麼可以在C++的各個類中訪問和修改全局變量

我試過以下(我正在粘貼部分代碼),但它給了我ld錯誤,我可以沒有解決。我想問問什麼是解決這個問題的最好和最乾淨的方法。

file1.h

int data_received; //global variable 
class abc 
{ 
. 
. 
. 
public: 
    void send_data(..) 
. 
. 
. 
}; 

file1.c中

​​

file2.c中

//data receive class 

void transmit_data() 
{ 
.... 
.... 
.... 
//data sent upstream 
data_received = 1; 
} 

找遍了很多帖子上stackoverflow但沒有明確的答案。有些人建議使用extern變量,但沒有在多個類函數中修改外部變量的清晰示例。

回答

1

請了解

  • Declare VS C和C++ Define
  • compile VS link

define全局變量

// file1.cpp 
int data_received; 

extern告訴編譯器是data_received可以發現,當連接器。

// file2.cpp 
extern int data_received; 

此外,static可以限制my_global_var僅在文件中使用定義它。例如

// file3.cpp 
static int my_global_var = 1; 

錯誤將在linker

// file4.cpp 
extern int my_global_var; 
+0

謝謝。你可以使用class_name :: my_global_var來訪問另一個類的函數中的靜態變量嗎?你是否需要#包括課程? – user2979872

+0

你可以在其他文件/函數中訪問'static member'。請學習C++中的靜態關鍵字。當然,'#include'是必要的(編譯步驟,你必須告訴編譯它在哪裏)。 – Jcppython

+0

@ user2979872瞭解更多關於'compile'和'link'的更多信息。它會幫助你。 – Jcppython

1

你需要標記的頭文件extern,然後把它定義一次,無論是在file1.cfile2.c

例如

file1.h

extern int data_received; 

file1.c

// initialize it 
int data_received = 0; 

file2.c中

// either do this if the include is logically needed 
#include "file1.h" 
// or 
extern int data_received; 

// then use it normally 
void foo() { 
    cout << data_received << endl; 
} 

或者,如果這是C++,你可以聲明變量作爲類static變量,在.cpp文件中定義它,然後用它像一個正常的變量但前綴爲該類的範圍解析。例如

class Something { 
public: 
    static int data_received = 0; 
}; 

void foo() { 
    cout << Something::data_received << endl; 
} 
+0

將發生的我寫。我需要修改另一個類中的函數內的變量。我不能在函數中使用extern。如果您這麼認爲,請發佈您的代碼 – user2979872

+0

@ user2979872發佈代碼 – Curious

+0

如何使用代碼訪問while循環的下一個迭代? – user2979872

1

通過讓在頭文件deined全局變量,你會在任何「C」文件,它包含創建它的一個副本。 ld將會有抱怨。 你需要在頭文件中聲明它爲'extern',然後在一個'c'文件中定義它。

file1.h

extern int data_received; 

file1.c中

#include <file1.h> 
int data_received = 0; 

文件2。c

#include <file1.h> 

這樣你只能定義它的一個副本並使其包含頭文件的所有文件。

+0

,你不需要在頭文件中聲明它爲'extern'。你仍然有一個在file1.c中定義的變量副本,只是讓file2.c知道它。兩種解決方案都是正確你的選擇。 – Serge