具有静态变量的静态内联函数
static inlined function with static variables
在内联函数中读取静态变量后,我编写了这个测试程序:
主.cpp:
#include <iostream>
#include "a.h"
#include "f.h"
void g();
int main()
{
std::cout << "int main()n";
f().info();
g();
}
啊:
struct A
{
A() { std::cout << "A::A()n"; }
void info() { std::cout << this << 'n'; }
};
f.h:(由于命名空间未命名,每个编译单元的本地单例)
namespace {
inline A& f()
{
static A x;
return x;
}
}
克.cpp:
#include <iostream>
#include "a.h"
#include "f.h"
void g()
{
std::cout << "void g()n";
f().info();
}
问题是我使用不同的编译器没有得到相同的结果:
g++ 4.8.2:确定
int main()
A::A()
0x6014e8
void g()
A::A()
0x6014d0
clang++ 3.7.0:确定
int main()
A::A()
0x6015d1
void g()
A::A()
0x6015c1
ICPC 15.0.2:在 g() 中不调用 A::A() !
int main()
A::A()
0x601624
void g()
0x601620
这是 icpc 中的错误吗?程序的行为没有定义吗?如果我在 f.h 中将"命名空间 {...}"替换为"静态",则按预期在 g() 中调用 A::A()。行为不应该是一样的吗?
如果我在 f.h 中删除"命名空间 {...}",A::info() 会在 main() 和 g() 中打印相同的对象地址,并且 A::A() 只按预期调用一次(使用所有编译器)。
由于 C++11 要求未命名命名空间中的名称具有内部链接,因此每个翻译单元都应该有自己的f()
版本,因此,它是自己的static A x
版本。所以 gcc 和 clang 是正确的。
似乎 icpc 没有遵循 C++11 标准,而是遵循 C++03,这允许通过外部链接声明这些名称。因为当您使用 icpc 明确地将f()
内部static
效仿时,我强烈怀疑这只是一个错误。
相关文章:
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- 如何将 cpp 文件中的静态函数公开给其他文件
- 将函数的引用设置为其他 c++ 文件中的非静态函数
- 方法的静态函数的等价性
- 扩展包含静态函数的类
- 非静态函数可以访问静态变量吗?
- 调用非静态函数作为谓词?