全局变量可以在C++中的各种类中访问和修改吗
can global variables be accessed and modified in various classes in C++
我有 运行 代码意大利面条,我需要在其中进行流量控制,即一次发送一个数据。我如何使用全局变量来解决这个问题?如果全局变量不起作用,在多个函数中访问和修改变量的方法是什么,这些函数可能位于不同的 classes
我尝试了以下操作(我正在粘贴部分代码),但它给了我无法解决的 ld 错误。我想问问什么可能是解决这个问题的最好和最干净的方法。
file1.h
int data_received; //global variable
class abc
{
.
.
.
public:
void send_data(..)
.
.
.
};
file1.c
void send_data()
{
while(!end_of_file)
{
read_line;
data_received = 0;
transmit_data(line);
while(data_received == 0)
cout<<"waiting for response before proceeding\n";
}
}
file2.c
//data receive class
void transmit_data()
{
....
....
....
//data sent upstream
data_received = 1;
}
我在Whosebug上搜索了很多帖子,但没有明确的答案。有些人建议使用外部变量,但没有明确的外部变量在多个 class 函数中被修改的例子。
你需要在头文件中标记extern
,然后在file1.c
或file2.c
[=中定义一次一次 19=]
例如
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++,您可以在 class 中将该变量声明为 static
变量,在 .cpp
文件中定义它,然后像普通变量一样使用它,但是前缀为 class 的范围解析。例如
class Something {
public:
static int data_received = 0;
};
void foo() {
cout << Something::data_received << endl;
}
通过在头文件中定义全局变量,您将在它包含的任何 'c' 文件中创建它的副本。到目前为止,ld 会抱怨。
您需要在头文件中将其声明为 'extern',然后在单个 'c' 文件中定义它。
file1.h
extern int data_received;
file1.c
#include <file1.h>
int data_received = 0;
file2.c
#include <file1.h>
这样您只需定义它的一个副本,并让所有包含头文件的文件都知道它。
请详细了解
Declare
与 C 和 C++ 中的 Define
。
compile
对比 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;
我有 运行 代码意大利面条,我需要在其中进行流量控制,即一次发送一个数据。我如何使用全局变量来解决这个问题?如果全局变量不起作用,在多个函数中访问和修改变量的方法是什么,这些函数可能位于不同的 classes
我尝试了以下操作(我正在粘贴部分代码),但它给了我无法解决的 ld 错误。我想问问什么可能是解决这个问题的最好和最干净的方法。
file1.h
int data_received; //global variable
class abc
{
.
.
.
public:
void send_data(..)
.
.
.
};
file1.c
void send_data()
{
while(!end_of_file)
{
read_line;
data_received = 0;
transmit_data(line);
while(data_received == 0)
cout<<"waiting for response before proceeding\n";
}
}
file2.c
//data receive class
void transmit_data()
{
....
....
....
//data sent upstream
data_received = 1;
}
我在Whosebug上搜索了很多帖子,但没有明确的答案。有些人建议使用外部变量,但没有明确的外部变量在多个 class 函数中被修改的例子。
你需要在头文件中标记extern
,然后在file1.c
或file2.c
[=中定义一次一次 19=]
例如
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++,您可以在 class 中将该变量声明为 static
变量,在 .cpp
文件中定义它,然后像普通变量一样使用它,但是前缀为 class 的范围解析。例如
class Something {
public:
static int data_received = 0;
};
void foo() {
cout << Something::data_received << endl;
}
通过在头文件中定义全局变量,您将在它包含的任何 'c' 文件中创建它的副本。到目前为止,ld 会抱怨。 您需要在头文件中将其声明为 'extern',然后在单个 'c' 文件中定义它。
file1.h
extern int data_received;
file1.c
#include <file1.h>
int data_received = 0;
file2.c
#include <file1.h>
这样您只需定义它的一个副本,并让所有包含头文件的文件都知道它。
请详细了解
Declare
与 C 和 C++ 中的Define
。compile
对比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;