在同一个编译单元中,C++标准说明了静态初始化顺序 - 它是静态对象声明的顺序.但是使用Sun Studio 12编译器我遇到了不直观的行为.我定义了一个模板化的类helper<T>,它包含一个静态_data类型T的成员和一个使用_data被调用的静态成员函数foo.在我的.cpp文件中,我有以上main():
struct A { /* some definition */ };
typedef helper<int> s0;
typedef helper<A> s1;
Run Code Online (Sandbox Code Playgroud)
请注意,对于typedef的helper<int>来自之前的的typedef helper<A>.因此,根据标准,我预计helper<int>::_data将在之前构建helper<A>::_data(记住_data是静态成员).在海湾合作委员会就是这种情况,在Sun上并非如此.
这是有问题的,因为A的构造函数使用helper<int>::_data.我只有一个编译单元,没有早期的潜在实例化helper<A>,所以我认为订单应该很好地定义.这是一个Sun编译器错误,还是typedef技术上不构成定义/实例化?我的意思是,标准允许Sun编译器的行为吗?
我有以下main():
int main()
{
//Swapping the order of these has no effect on Sun
s0::foo();
s1::foo();
}
Run Code Online (Sandbox Code Playgroud)
s0或s1没有其他用途.
我有一个使用 C++ Builder 10.1 Berlin 构建的跨平台 C++ 应用程序,并且在理解对象的生命周期处理时遇到问题,在这种情况下是在类之外声明的字符串。我创建了一个新的表单应用程序并添加了一些代码。cpp 文件如下所示:
#include
#pragma hdrstop
#include "FmrMain.h"
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
const String Hello = "Hello";
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ShowMessage(Hello);
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
ShowMessage(Hello);
}
Run Code Online (Sandbox Code Playgroud)
我使用 CLANG 增强型 C++11 编译器 bcc32c 编译它,运行应用程序并再次关闭表单。当 TForm1::FormDestroy 被调用时,Hello 已经被销毁了。当我使用经典编译器 bcc32 为 win32 编译代码时,字符串在 FormDestroy 之后被销毁。
有人可以解释这一点或提供一些有关我必须寻找的主题的信息吗?为什么基于 CLANG 的编译器在这里表现不同?
编辑
当我使用自定义类而不是字符串时,调试更容易。
class Foo {
public:
Foo(){};
~Foo(){}
};
Foo A;
//--------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------------------- …Run Code Online (Sandbox Code Playgroud) 考虑以下.我有两个导出的常量如下:
// somefile.h
extern const double cMyConstDouble;
extern const double cMyConstDouble2;
Run Code Online (Sandbox Code Playgroud)
和
// somefile.cpp
const double cMyConstDouble = 3.14;
const double cMyConstDouble2 = 2.5*cMyConstDouble;
Run Code Online (Sandbox Code Playgroud)
现在引用这些常量来定义两个静态(局部可见)常量:
// someotherfile.cpp
#include "somefile.h"
static const double cAnotherDouble = 1.1*cMyConstDouble;
static const double cAnotherDouble2 = 1.1*cMyConstDouble2;
printf("cAnotherDouble = %g, cAnotherDouble2 = %g\n",
cAnotherDouble, cAnotherDouble2);
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
cAnotherDouble = 3.454, cAnotherDouble2 = 0
Run Code Online (Sandbox Code Playgroud)
为什么第二双0?我正在使用.NET 2003 C++编译器(13.10.3077).
c++ ×3
c++builder ×1
clang ×1
const ×1
double ×1
extern ×1
firemonkey ×1
static ×1
templates ×1
typedef ×1