我正在阅读Meyers编写的"Effective C++",并且遇到了"翻译单元"一词.
有人可以给我一个解释:
1)究竟是什么
2)在使用C++编程时,我应该何时考虑使用它
3)如果它只与C++有关,或者它可以与其他编程语言一起使用
我可能已经在不知道术语的情况下使用它了....
何时在C++中使用未命名的命名空间?在任何意义上它比独立功能更好吗?是否应该仅在源文件中使用而不在头文件中使用?
今天有人断言你绝不应该在头文件中使用匿名命名空间.通常这是正确的,但我似乎记得有人告诉我,其中一个标准库在头文件中使用匿名命名空间来执行某种初始化.
我记得没错吗?有人可以填写详细信息吗?
我理解当你using在头文件中放入一个声明时可以遇到的麻烦,所以我不想这样做.相反,我试图将using(或a namespace foo =)放在类声明中,以减少头文件中的重复输入.不幸的是我遇到编译错误.似乎它将是一个有用的功能.
#ifndef FOO_H
#define FOO_H
// This include defines types in namespace gee::whiz::abc::def,
// such as the class Hello.
#include "file_from_another_namespace.h"
// using namespace gee::whiz::abc::def; // BAD!
namespace x {
namespace y {
namespace z {
struct Foo {
using namespace gee::whiz::abc::def; // Illegal.
namespace other = gee::whiz::abc::def; // Illegal.
// Foo(gee::whiz::abc::def::Hello &hello); // annoyingly long-winded
Foo(other::Hello &hello); // better
//...
};
} } } // end x::y::z namespace
#endif // FOO_H …Run Code Online (Sandbox Code Playgroud) 我使用C++的经验预先添加了字符串类,所以我在某些方面重新开始.
我正在为我的类定义我的头文件,并希望为url创建一个静态常量.我这样做的方法如下:
#include <string>
class MainController{
private:
static const std::string SOME_URL;
}
const std::string MainController::SOME_URL = "www.google.com";
Run Code Online (Sandbox Code Playgroud)
但这在链接期间给了我一个重复的定义.
我怎么能做到这一点?
我正在使用 Visual Studio Code,当我调试(我正在调试用 Clang 编译的 C++ 代码)时,我只看到局部变量。我没有看到任何全局变量列表。
如何查看所有变量?
在这种情况下,我在一个循环中,我只看到循环内部定义的所有变量,而不是外部定义的变量。
有人质疑命名空间和文件夹结构是否会影响C#中程序集的性能.答案非常有用,但具体针对C#和CLR.
如果使用gcc用C++编写,命名空间和文件夹结构将如何影响程序集的性能?其他操作系统的情况如何,例如Linux或Mac OS?
如果存在任何重大性能问题,我应该做什么或避免做什么以最大限度地提高性能?
在命名空间范围内声明的(文件本地; .cpp)const限定变量具有内部链接,因此是转换单元本地.在匿名命名空间中仍然存在仍然包装常量的原因吗?
例如,有没有理由更喜欢以下两种中的任何一种,如果是这样,为什么呢?
// file.cpp
namespace foo {
const int kMyLocalConstant = 42; // internal linkage
} // namespace foo
Run Code Online (Sandbox Code Playgroud)
VS
// file.cpp
namespace foo {
namespace {
const int kMyLocalConstant = 42; // internal linkage
} // namespace
} // namespace foo
Run Code Online (Sandbox Code Playgroud)
我很高兴能得到C++ 03以及C++ 11的答案,如果这个上下文中有两个不同的话.
可能重复
我已经阅读了优秀的答案
但我没有看到它回答我的具体问题(如果我错了请纠正我),因为答案集中在非const变量标识符和非静态自由函数上.我的问题集中在文件本地命名空间范围的常量,即已经具有内部链接的变量标识符.也许有一个我没有找到的更合适的骗局.
可能重复:
为什么使用未命名的命名空间以及它们有什么好处?
查看someones代码,这是他们声明的内容:
namespace {
struct myStruct {
int x;
int y;
} obj1;
}
Run Code Online (Sandbox Code Playgroud)
..在一个函数我看到它像这样使用:
myStruct& var = obj1;
Run Code Online (Sandbox Code Playgroud)
(注意namespace是匿名的.)
从我如何使用它,我无法弄清楚为什么它被声明和使用这样.
宣布这样做的做法有何不同?
另外,为什么指针是这样创建的而不是这里显示的传统样式.即myStruct*ptr;
谢谢!
我有一个C结构(在C头文件中),如下所示:
struct Foo {
int a;
int b;
int c;
};
typedef struct Foo Foo;
Run Code Online (Sandbox Code Playgroud)
我想测试这些结构的两个向量的相等性,因此我想为我的翻译单元为此结构定义一个自定义的相等运算符。
我能够做到
static inline bool operator==(const Foo&, const Foo&) {...}
Run Code Online (Sandbox Code Playgroud)
但不是
namespace {
bool operator==(const Foo&, const Foo&) {...}
}
Run Code Online (Sandbox Code Playgroud)
为什么std :: vector的相等模板找不到该运算符,并且有比在全局名称空间中插入静态内联更好的方法吗?
如果我以明显的方式在.h中声明它:
namespace <named_namespace> {
namespace {
…
<type> <function>(<parameters>);
…
}
}
Run Code Online (Sandbox Code Playgroud)
并将其实施.cpp,将发生编译错误:
'<type> <named_namespace>::{anonymous}::<function>(<parameters>)' should have been declared inside <named_namespace>
如果不将函数的实现放在单个文件中,是否可以避免此错误?目前我使用关键字static代替,但它会产生多次恼人的警告:
'<type> <named_namespace>::<function>(<parameters>)' declared 'static' but never defined
正如我所理解的那样,只能通过将函数保存在单个文件(标题或源代码)中来禁用它.
欢迎使用交叉编译器解决方案(如果有的话).
或者将头文件拆分为"公共"和"私有"部分更有效?
c++ ×12
namespaces ×7
header ×2
c++03 ×1
c++11 ×1
c++17 ×1
class ×1
definition ×1
function ×1
linkage ×1
object ×1
oop ×1
optimization ×1
performance ×1
private ×1
using ×1