相关疑难解决方法(0)

为什么在C++中将"使用命名空间"包含在头文件中是一个坏主意?

在阅读Bruce Eckel关于命名空间的"Thinking in C++"时,我遇到了以下声明:

但是,您几乎从未在头文件中看到using指令(至少不在范围之外).原因是using指令消除了对该特定命名空间的保护,并且效果持续到当前编译单元结束.如果在头文件中放置using指令(在作用域之外),则意味着在包含此头文件的任何文件中都会发生"名称空间保护"丢失,这通常意味着其他头文件.

您是否愿意用一些简单的例子来帮助我理解上述陈述?

c++ namespaces global-namespace

26
推荐指数
3
解决办法
2万
查看次数

扭曲逻辑:一个文件中的全局变量引用外部变量,但也由该外部变量引用

fileA.cpp:

#include <iostream>
extern int iA;
extern int iB= iA;
int main()
{
std::cout<<iA<<','<<iB;
}
Run Code Online (Sandbox Code Playgroud)

fileB.cpp

extern int iB;
extern int iA = 2*iB;
Run Code Online (Sandbox Code Playgroud)

编译和链接并运行,进入调试和发布模式是0,0 我的问题是它是如何工作的,为什么链接阶段没有问题?我正在使用VC++ 2003.

c++ linker compilation external

6
推荐指数
1
解决办法
667
查看次数

在头文件中声明和定义并仅在其 cpp 文件中使用的变量存在多重定义错误

我正在将为一个芯片编译而编写的代码移动到另一芯片上。

出现的一个问题是存在大量的多重定义错误。其中一些似乎是由于第一个芯片的链接器让我在跨多个源文件使用变量时懒于声明变量 extern。我以前根本没有使用 extern (在 Something.h 中声明并定义一个变量,在 Something.cpp 和其他包含 Something.h 的源文件中使用它),并且它编译和链接得很好。

我相信我已经很好地解决了这些问题:现在我共享的变量具有以下模式:

某事.h

extern int foo;
Run Code Online (Sandbox Code Playgroud)

一些东西.cpp

int foo = 0;

//using foo to do stuff
Run Code Online (Sandbox Code Playgroud)

主要.cpp

#include "Something.h"

//using foo to do stuff
Run Code Online (Sandbox Code Playgroud)

都好。

这是我不明白的一点,似乎无法在这里或在谷歌上找到任何答案。我注意到相同的多重定义错误是由 Something.h 中声明和定义并在 Something.cpp 中使用的变量引起的。

Something.h 有一个包含保护,所以我不认为这是因为 Something.h 在我的程序中的某个地方被多次包含。

如果我将其声明为 extern 并在 cpp 文件中定义它,错误就会消失,但这对我来说是错误的。我相信不需要 extern 来链接 Something.h 和 Something.cpp 之间的变量。

任何建议将不胜感激,我真的很想了解我在这里缺少什么。

(顺便说一句,我正在使用 Arduino IDE 为 ESP32 进行编译。)

c++ linker extern

4
推荐指数
1
解决办法
4075
查看次数