相关疑难解决方法(0)

未命名/匿名命名空间与静态函数

C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)

您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名命名空间可以在它们创建的文件访问,就好像你有一个隐含的using子句.

我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?

c++ namespaces

486
推荐指数
8
解决办法
20万
查看次数

什么是"静态"功能?

问题是关于普通函数,而不是 static方法,正如评论中所阐明的那样.

好的,我理解static变量是什么,但什么是static函数?

为什么如果我声明一个函数,让我们说void print_matrix,让我们说a.c(WITHOUT a.h)和include "a.c"- 我得到"print_matrix@@....) already defined in a.obj",但是如果我声明它static void print_matrix然后它编译?

更新只是为了清理 - 我知道包括.c很糟糕,正如你们许多人指出的那样.我只是做它在暂时清除空间main.c,直到我有更好的想法如何将所有这些功能集成到适当.h.c文件.只是一个临时的快速解决方案.

c static terminology function

465
推荐指数
11
解决办法
55万
查看次数

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

C/C++全局与静态全局

可能重复:
静态与全局

我对全局变量和静态全局变量之间的差异感到困惑.如果static表示此变量仅对同一文件是全局的,那么为什么在两个不同的文件中同名会导致名称冲突?

有人可以解释一下吗?

c c++ static global-variables

54
推荐指数
2
解决办法
7万
查看次数

根据标准委员会的说法,为什么匿名命名空间不能完全替代namespace-static?

根据这个答案,命名空间范围的静态变量在C++ 11中是未被完美的.也就是说,它们在C++ 03中被弃用,因为匿名命名空间被认为更好.但是C++ 11对它们不予重视.

为什么?N3296将其原因列为:

不应该弃用在命名空间范围中使用静态.匿名命名空间不足以替代该功能.

这显然是委员会接受的.为什么?什么是匿名命名空间不完全取代此功能?

我更喜欢那些有标准委员会讨论的文件或书面记录的答案.

c++ c++11

50
推荐指数
3
解决办法
8686
查看次数

在C++ 11中,namespace-`static仍然被弃用吗?

可能重复:
静态关键字的弃用...不再?

在C++ 2003中,static不推荐使用namespace- :

[C++03: 7.3.1.1/2]:static在声明命名空间范围内的对象时,不推荐使用该关键字(见附录D); 所述 未命名的命名空间提供了一个更好的选择.

我无法找到C++ 2011中存在任何此类子句的位置(建议不引用),并且7.1.1似乎没有禁止命名空间 - static(如果有的话,这表明该功能最终已从语言中删除); 然而,这两个案例都没有列入C.2(这表明2003年和2011年之间存在重大差异).

名称空间是否static未被提及?

c++ c++11

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

常规命名空间内匿名命名空间内符号的链接

在C++中,将函数或变量放在匿名命名空间中会使其内部链接,即与static在文件级别上声明它相同,但却是惯用的C++.

普通命名空间中的匿名命名空间怎么样?它仍然保证内部联系吗?

// foo.cpp

void func1() {
    // external linkage
}

static void func2() {
    // internal linkage
}

namespace {
    void func3() {
        // internal linkage
    }
}

namespace ns1 {
    void func4() {
        // external linkage
    }

    namespace {
        void func3() {
            // still internal linkage?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ namespaces anonymous linkage

14
推荐指数
3
解决办法
7238
查看次数

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

我希望有一个静态函数,我在定义之前在我的.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
查看次数

辅助工具的静态自由函数或成员函数?

假设您具有以下非静态成员函数:

// .h
struct C {
    void f();
}
Run Code Online (Sandbox Code Playgroud)

现在假设您希望C::f通过使用一些特定的子函数来实现C::f,以使其更短且更易读; 例如:

// .cpp
void C::f() {
    h1();
    h2();
    //...
    hn();
}
Run Code Online (Sandbox Code Playgroud)

假设许多h()函数不需要访问任何数据成员.这意味着您可以将函数定义为静态自由函数(在一个.cpp中)或作为成员函数(静态或非静态).

你会让它们成为静态自由函数或C的函数成员吗?

第一种情况的一个优点是您不必在以下情况下声明它们C:

// .cpp
static void h1() {//...}
static void h2() {//...}
static void hn() {//...}
Run Code Online (Sandbox Code Playgroud)

此外,如果我没有错,则不存在全局命名空间污染的风险,因为它们是静态的,即它们只能从同一单元.cpp内的其他函数中看到(其中C :: f也被定义).

而在第二种情况下,你将不得不声明它们C,虽然,正如我所说,它们只应该被使用C::f.

// .h
struct C {
    void f();
  private:
    static void h1(); // can be either static or non-static
    static void h2();
    static void hn();
}

// …
Run Code Online (Sandbox Code Playgroud)

c++

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