Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ h.中的声明。.cpp中的定义。对的_C++_Global Variables_Declaration_Definition - Fatal编程技术网

C++ h.中的声明。.cpp中的定义。对的

C++ h.中的声明。.cpp中的定义。对的,c++,global-variables,declaration,definition,C++,Global Variables,Declaration,Definition,太不可思议了。30多年来,我一直在编程,似乎忘记了如何处理全局变量。(我想这是因为我从来没有真正使用过它们。)在头文件中- // any.h bool neat; 在cpp中- // any.cpp #include <any.h> bool neat = false; //any.cpp #包括 bool-neat=false; 它告诉我我正在重新定义。所以我拿出了“bool” // any.cpp #include <any.h> neat = false;

太不可思议了。30多年来,我一直在编程,似乎忘记了如何处理全局变量。(我想这是因为我从来没有真正使用过它们。)在头文件中-

// any.h
bool neat;
在cpp中-

// any.cpp
#include <any.h>
bool neat = false;
//any.cpp
#包括
bool-neat=false;
它告诉我我正在重新定义。所以我拿出了“bool”

// any.cpp
#include <any.h>
neat = false;
//any.cpp
#包括
整洁=错误;
现在它告诉我“错误:'neat'不命名类型”” 它怎么能不知道“整洁”是一个布尔?是同一个翻译单位 所以我不需要一个外部。我没有声明任何静态 所以我知道对文件范围没有限制。这应该是 全局变量

我对声明和定义之间区别的理解是 “声明”只是通知编译器一个名称是 某种类型的。而“定义”编译器实际上设置 在可执行文件中留出一些空间,以便名称存在


我做错了什么?

您需要在头文件中使用
extern
关键字(并在.c文件中保留
bool

//any.h
外表整洁;
//any.cpp
#包括
bool-neat=false;

这样做的原因是让链接器知道在任何对象中的任何位置都有一个该名称的变量,而不是在使用该变量的每个对象中为它保留内存。但是,在实际定义变量的对象中,必须像对非导出变量那样定义变量。

您需要在头文件中使用
extern
关键字(并将
bool
保留在.c文件中)

//any.h
外表整洁;
//any.cpp
#包括
bool-neat=false;

这样做的原因是让链接器知道在任何对象中的任何位置都有一个该名称的变量,而不是在使用该变量的每个对象中为它保留内存。但是,在实际定义变量的对象中,必须像对非导出变量那样定义变量。

注意
bool-neat
(并且
bool-neat=false;
)是一个;这意味着,如果将它们同时放在头文件和实现文件中,就会出现多个定义错误

你可以用声明来改变它

此外,使用extern且没有初始值设定项的变量声明不是定义

e、 g.您可以在头文件中将它们声明为

extern bool neat; // declaratioin
并在实现文件中将它们定义为

bool neat;        // definition
                  // or bool neat = false; same effect here
关于第二个代码段的错误,请注意
neat=false不是声明或定义;它是一个语句(赋值),必须放在函数中。e、 g

// any.h
bool neat; // definition

// any.cpp
#include <any.h>
void init_neat() { 
    neat = false;
}
int main() {
    init_neat();
    // use neat ...
}
//any.h
bool-neat;//定义
//any.cpp
#包括
void init_neat(){
整洁=错误;
}
int main(){
init_neat();
//使用整洁的。。。
}

注意
bool整洁
(并且
bool-neat=false;
)是一个;这意味着,如果将它们同时放在头文件和实现文件中,就会出现多个定义错误

你可以用声明来改变它

此外,使用extern且没有初始值设定项的变量声明不是定义

e、 g.您可以在头文件中将它们声明为

extern bool neat; // declaratioin
并在实现文件中将它们定义为

bool neat;        // definition
                  // or bool neat = false; same effect here
关于第二个代码段的错误,请注意
neat=false不是声明或定义;它是一个语句(赋值),必须放在函数中。e、 g

// any.h
bool neat; // definition

// any.cpp
#include <any.h>
void init_neat() { 
    neat = false;
}
int main() {
    init_neat();
    // use neat ...
}
//any.h
bool-neat;//定义
//any.cpp
#包括
void init_neat(){
整洁=错误;
}
int main(){
init_neat();
//使用整洁的。。。
}

在评论中,您说:

您是指类(或命名空间)中的函数吗?还是说作为全局函数?如果是这样,那么使用两个全局名称(setNeat和getNeat)而不是一个(neat)会更好吗

函数是在命名空间中还是在全局函数中并不重要。在我看来,通过函数访问数据比通过全局变量访问数据更好

在函数的实现中,您有各种选项

  • 您可以使用变量来维护状态
  • 您可以将函数调用传递给另一个函数,该函数的实现维护该状态
  • 您可以使用聚合对象(如
    结构
    )来维护应用程序的许多其他全局状态

  • 当您通过函数提供对数据的访问时,您可以选择更改数据的维护方式和位置。

    在评论中,您说:

    您是指类(或命名空间)中的函数吗?还是说作为全局函数?如果是这样,那么使用两个全局名称(setNeat和getNeat)而不是一个(neat)会更好吗

    函数是在命名空间中还是在全局函数中并不重要。在我看来,通过函数访问数据比通过全局变量访问数据更好

    在函数的实现中,您有各种选项

  • 您可以使用变量来维护状态
  • 您可以将函数调用传递给另一个函数,该函数的实现维护该状态
  • 您可以使用聚合对象(如
    结构
    )来维护应用程序的许多其他全局状态

  • 当您通过函数提供对数据的访问时,您可以选择更改数据的维护方式和位置。

    bool-neat实际上定义了一个整洁的变量,它只是没有初始化它。我从来没有真正使用过它们。我想如果可以的话,请坚持使用它。最好使用
    bool getNeat()
    void setNeat(bool)而不是使用全局变量。@RSahu-您的意思是作为类(或命名空间)中的函数吗?还是说作为全局函数?如果是这样的话,那怎么更好呢