相关疑难解决方法(0)

匿名命名空间:它们真的那么棒吗?

我一直在使用static关键字来定义内部链接.后来,我转而采用C++方式在匿名命名空间中包装本地事物.

但是,现在当我使用匿名命名空间多年时,我开始认为static关键字更容易使用!

一个常见的问题是我有这种模式:

namespace {
    // ...five pages of code...
}  // namespace
Run Code Online (Sandbox Code Playgroud)

要查看某个函数是否具有内部或外部链接,我现在必须滚动很多,而不是旧的C样式,我可以检查函数/对象是否static在它前面.

我知道匿名命名空间有些东西static不能 - 隐藏typedef - 但不管怎样,我个人对此并不是很感兴趣.

你对此有何看法?匿名命名空间的胜利是否很好,它保证了可读性的降低?或者我都错了?

c++ static namespaces

16
推荐指数
1
解决办法
6933
查看次数

函数声明中的静态关键字在函数定义中可能会丢失吗?

我希望有一个静态函数,我在定义之前在我的.c文件中声明:

//file a.c version 1
static int foo();
...
static int foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)

但是,似乎我可以将static关键字从函数定义中删除,并且我没有得到编译器警告......例如

//file a.c version 2
static int foo();
...
int foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)

假设这两种形式完全相同,我是否正确?
如果是这样,为什么允许这种差异,我应该使用哪种形式?

c c++ static declaration function

11
推荐指数
1
解决办法
7321
查看次数

为什么要将类型放在未命名的命名空间中?

我理解使用未命名的命名空间来使函数和变量具有内部链接.头文件中不使用未命名的命名空间; 只有源文件.源文件中声明的类型不能在外部使用.那么在未命名的命名空间中放置类型有什么用呢?

请参阅这些链接,其中提到的类型可以放在未命名的命名空间中:

c++ unnamed-namespace

9
推荐指数
1
解决办法
929
查看次数

是否可以在未命名的命名空间中放置函数声明?

我有一个包含一组函数的文件.对于其中一个函数,我想编写一个辅助函数,它基本上采用char*并跳过所有空格.

以下是我认为应该如何做的事情:

namespace {
    const int kNotFound = -1;

    void SkipWhitespace(const char *s); // forward declaration - doesn't seem to work?
}

void foo(const char *s1, const char *s2) {
    // do some stuff

    SkipWhitespace(s1);
    SkipWhitespace(s2);

    // continue with other stuff
}

void SkipWhitespace(const char *s) {
    for (; !isspace(s); ++s) {}
}
Run Code Online (Sandbox Code Playgroud)

但这给了我一个编译器错误.我是否需要将定义放在未命名的命名空间中?

c++ namespaces

6
推荐指数
2
解决办法
4774
查看次数

6
推荐指数
2
解决办法
1883
查看次数

不必要地使用未命名的命名空间C++

我一直在公司里看到这样的代码:

namespace {

const MAX_LIMIT = 50;
const std::string TOKEN = "Token";

}
Run Code Online (Sandbox Code Playgroud)

我很困惑,为什么你需要一个匿名命名空间.一方面,您需要MAX_LIMITAND 的本地翻译单元TOKEN.但是,由于这个原因,没有匿名命名空间就已经实现了const.static const而且简单const都实现了本地翻译单元.

另一方面,如果文件中的某个地方有一个名为相同的变量,则没有命名冲突.

int foo()
{
std::string TOKEN = "MyToken"; // Clash! ::TOKEN vs TOKEN can be used.
}
Run Code Online (Sandbox Code Playgroud)

这将证明匿名命名空间的合理性.但是,您在函数中需要一个变量名称的频率实际上是在函数const外部声明的变量吗?我的回答永远不会.所以在实践中,对我来说不需要未命名的命名空间.任何提示?

c++ namespaces anonymous unnamed-namespace

6
推荐指数
2
解决办法
373
查看次数

为什么Google Test Sample会将测试放在匿名名称空间中?

这不是未命名名称空间优于静态名称优势吗? 将其标记为重复之前,请仔细阅读该问题。我不是在问为什么使用未命名的名称空间而不是静态名称空间!
我问,为什么将Google测试放在未命名的命名空间中?这是Google测试遵循的一些约定吗?如果是,为什么?无论它们是否在未命名的名称空间中,测试都可以正常工作,因此显然不是必需的。**

我从github克隆了google测试,并为我的mac构建了它。它工作正常,但是我在示例测试代码中注意到,他们给了他们将测试放在未命名的名称空间中的条件。有人知道为什么吗?

例如,请参见以下文件:googletest / googletest / samples / sample1_unittest.cc(https://github.com/google/googletest/blob/master/googletest/samples/sample1_unittest.cc#L41

该文件的一部分如下所示:

// Step 1. Include necessary header files such that the stuff your
// test logic needs is declared.
//
// Don't forget gtest.h, which declares the testing framework.

#include <limits.h>
#include "sample1.h"
#include "gtest/gtest.h"
namespace {

// Step 2. Use the TEST macro to define your tests.
...
TEST(FactorialTest, Negative) {
// This test is named "Negative", …
Run Code Online (Sandbox Code Playgroud)

c++ unit-testing googletest

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

C++命名空间....匿名命名空间是合法的吗?

namespace {int Foo(int a); }

像这样.这段代码是否合法?

这合法吗?而且,我可以在任何地方引用Foo吗?或者只是某个域名?

谢谢.

c++ namespaces

5
推荐指数
2
解决办法
551
查看次数

非类功能可以私有化吗?

我在我创建的命名空间中有一些函数在我的程序中使用.

在头文件中:

namespace NQueens
{
    static int heur = 0;
    int CalcHeuristic(char** state, int size);
    void CalcHorzH(char ** state, int &heuristic, int size);
    void CalcColH(char ** state, int &heuristic, int size);
    void CalcDiagH(char ** state, int &heuristic, int size);
    int calcCollisions(int queensPerRow, int size);
}
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,从我的外部程序代码实际调用的唯一函数是CalcHeuristic(char** state, int size)函数.然后该函数调用其他函数本身.

由于这些不属于某个类,我的编译器不会让我声明其他函数private.有没有办法做到这一点?我应该担心吗?

c++

5
推荐指数
2
解决办法
1245
查看次数

隐藏'静态'类变量

所以我最近发现了一些使用特定技术的源代码(成语?)我以前没见过; 简而言之; 它不是使用相关类的静态变量,而是在类源文件中使用局部变量.

myclass.h

class myclass {
    //static int myint;

public:
    myclass();
    ~myclass();
    int count();
};
Run Code Online (Sandbox Code Playgroud)

myclass.cpp

#include "myclass.h"

int myint = 0;

myclass::myclass() {
    myint++;
}
myclass::~myclass() {
    myint--;
}

int myclass::count() {
    return myint;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "myclass.h"
#include <iostream>

int main() {
    myclass aclass;
    myclass theclass;

    std::cout << theclass.count(); //outputs 2
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么有人会采用这种方法而不是使用静态变量?

我对它的看法是,理想情况下,变量只能为myclass类(私有静态)所知,并且继承根本不重要(在这种情况下),这可能会阻止其他人知道这个变量.但这是我能看到的唯一优势; 不确定这是否值得保证.

同样的问题适用于私有的(静态/非静态)成员函数; 当继承不重要时.

编辑:读完之后,我要做的是因为有些人仍然使用C编程风格...

c++ static-members static-functions

2
推荐指数
1
解决办法
1202
查看次数

由于标头中的专业化初始化而避免重复的符号?

由于我试图在标题中提供的定义,我正在捕获重复的符号错误.这是Minimal,Complete和Verifiable示例中的错误.头文件和源文件如下所示.

$ clang++ main.cpp x.cpp y.cpp -o main.exe 2>&1 | c++filt
duplicate symbol Id<S>::id in:
    /tmp/main-3f2415.o
    /tmp/long long-d62c28.o
duplicate symbol Id<T>::id in:
    /tmp/main-3f2415.o
    /tmp/long long-d62c28.o
duplicate symbol Id<S>::id in:
    /tmp/main-3f2415.o
    /tmp/unsigned long long-bfa6de.o
duplicate symbol Id<T>::id in:
    /tmp/main-3f2415.o
    /tmp/unsigned long long-bfa6de.o
ld: 4 duplicate symbols for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

这是一个类似的问题,但它不涉及专门化:类模板中的静态成员初始化.这个问题有专门化,但它适用于MSVC而不是Clang:如何初始化参数化模板类的静态成员.并且这个问题表明它将它放在源(*.cpp)文件中,但我们的目标是避免使用头文件Clang 3.8和'Id<S>::id' required here, but no definition is available警告:类模板的显式特化的定义应放在C++中的哪个位置?

初始化时,GCC,ICC,MSVC,SunCC和XLC都可以.Clang和LLVM给了我麻烦.Clang和LLVM在专门化的明确实例化方面也遇到了麻烦extern,因此它拥有特殊的地狱.

我们支持C++ 03但是C++ 17,所以我们必须小心这个解决方案.天真地,我尝试将特化的初始化放在一个未命名的命名空间中,以防止符号转义转换单元,但这导致了编译错误.

在标头中初始化和专门化模板类时,我们如何避免重复的符号定义?


下面是MCVE,它是一个cat main.cpp a.h s.h s.cpp t.h …

c++ templates initialization static-members template-specialization

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