Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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静态关键字vs C++;私人范围? < > C++中的翻译单元本地代码静态< /代码>函数的C++等价关系是什么? 例如,在bar.c中具有以下内容: static void bar() { // ... } 在C++中,这会被写入私有的成员函数,比如 class foo { void bar(); }; void foo::bar() { // ... }_C++_C - Fatal编程技术网

C静态关键字vs C++;私人范围? < > C++中的翻译单元本地代码静态< /代码>函数的C++等价关系是什么? 例如,在bar.c中具有以下内容: static void bar() { // ... } 在C++中,这会被写入私有的成员函数,比如 class foo { void bar(); }; void foo::bar() { // ... }

C静态关键字vs C++;私人范围? < > C++中的翻译单元本地代码静态< /代码>函数的C++等价关系是什么? 例如,在bar.c中具有以下内容: static void bar() { // ... } 在C++中,这会被写入私有的成员函数,比如 class foo { void bar(); }; void foo::bar() { // ... },c++,c,C++,C,私有成员函数隐式地引入了this指针作为参数,因此它实际上无法与C风格的静态函数进行比较。但是,即使是私有静态成员函数bar()也会出现在公共界面中(并保持链接器的可访问性),而且也不具有可比性 虽然这些函数的可访问范围似乎相似,但这些选项看起来并不能很好地替代前面提到的C风格的静态函数语法 等效项是否为未命名命名空间中的函数,且仅对当前转换单元可见 namespace { void bar() { // ... } } [C] 具有文件作用域的静态函数。 这将创

私有成员函数隐式地引入了
this
指针作为参数,因此它实际上无法与C风格的
静态
函数进行比较。但是,即使是
私有静态
成员函数
bar()
也会出现在公共界面中(并保持链接器的可访问性),而且也不具有可比性

虽然这些函数的可访问范围似乎相似,但这些选项看起来并不能很好地替代前面提到的C风格的
静态
函数语法

等效项是否为未命名命名空间中的函数,且仅对当前转换单元可见

namespace {
    void bar() {
       // ...
    }
}
[C] 具有文件作用域的静态函数。 这将创建一个名为
bar
的函数,该函数具有内部链接

Undefined symbols for architecture x86_64:
  "bar()", referenced from:
      _main in main-c16bef.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
[C++]带文件作用域的静态函数 这将创建一个名为
bar
的函数,该函数具有内部链接

Undefined symbols for architecture x86_64:
  "bar()", referenced from:
      _main in main-c16bef.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
[C++]未命名命名空间 这将创建一个名为
bar
的函数,该函数具有内部链接

Undefined symbols for architecture x86_64:
  "bar()", referenced from:
      _main in main-c16bef.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
结论 它们都是相同的。我可能建议使用C++中的未命名命名空间,因为它消除了某些代码的超载:“静态< /COD>关键字”。但是从代码的作用来看,这并不重要

侧栏:内部链接是什么意思? 在C++和C++中,我们有三种联系:<强>外部< /强>,<强>内部< /强>和<强>没有链接< /强>。为了定义这些,我将引用C++ 2011第3.5节第2段:

当一个名称可能表示与另一个作用域中的声明引入的名称相同的对象、引用、函数、类型、模板、命名空间或值时,称该名称具有链接:

  • 当名称具有外部链接时,它所表示的实体可以通过来自其他翻译单元的范围或来自同一翻译单元的其他范围的名称来引用
  • 当名称具有内部链接时,它所表示的实体可以由同一翻译单元中其他作用域的名称引用
  • 当一个名称没有链接时,它所表示的实体不能被其他作用域中的名称引用
C 2011在第6.2.2节第2段中有类似的语言:

在构成整个程序的一组翻译单元和库中,具有外部链接的特定标识符的每个声明表示相同的对象或函数。在一个翻译单元中,具有内部链接的标识符的每个声明都表示相同的对象或函数。没有链接的标识符的每个声明都表示一个唯一的实体

因此,具有内部链接的名称仅在其所在的翻译单元中可见

侧栏:让我们举一个内部链接在实践中如何工作的例子:

让我们创建2个C++文件。strong>bar.cc将只包含一个带有内部链接的函数:

static void bar() {}
我们还将创建main.cc,它将尝试使用
bar()

如果我们编译这个,我们的链接器会抱怨。在main.cc翻译单元中找不到名为
bar
的函数。这是内部链接的预期行为

Undefined symbols for architecture x86_64:
  "bar()", referenced from:
      _main in main-c16bef.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

名称空间更好;它没有引入外来类型。为什么必须替换它<代码>静态函数也是C++中的一个有效构造。@ DALDA2000在C和C++中有不同的语义,你注意到了吗?下流者根本不理解问题是什么。这是确定的。很难理解这个问题是问事实还是偏好问题。“在C++的情况下,<代码>静态空格BAIR({…} /<代码>)仍然可以从其他翻译单元与链接的访问符代码< >命名空间{无效BAIR({…} } /代码>版本)访问。我在实践中看到过关于这一点的错误和奇怪行为。@πάνταῥεῖ: C 2011 6.2.2不太符合您的要求。@πάνταῥεῖ: 请提供一个实际的例子,它可以扔给一个实际的编译器,描述你所说的:@πάνταῥεῖ: 我刚刚试过:
bar.cpp
包含:
static void bar(){}
,而
foo.cpp
包含:
extern void bar();int main(){bar();}
。源文件编译为目标文件正常,未启用警告;链接这两个对象文件时会出现错误:
未定义架构x86的符号\u 64:
“bar()”,引用自:\u main in foo.o
ld:未找到架构x86\u 64的符号。QED?(添加了很多警告,编译器抱怨
bar()
已定义但未使用。)@πάνταῥεῖ: 我的回答并不粗鲁。。。但老实说,当你使用我不熟悉、在规范中找不到、在谷歌上也找不到的术语时,我不知道(现在仍然不知道)你的意思。“模块”一词是一个特别糟糕的选择,因为它在未来可能有一个含义:
Undefined symbols for architecture x86_64:
  "bar()", referenced from:
      _main in main-c16bef.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)