在C++中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这个,但它给了我奇怪的链接器错误:
class foo
{
private:
static int i;
};
int foo::i = 0;
Run Code Online (Sandbox Code Playgroud)
我猜这是因为我无法从课外初始化私人成员.那么最好的方法是什么?
我知道在C++中0x或者NULL被nullptr基于指针的应用程序所取代.我只是好奇他们为什么要更换它?
在处理指针时,在什么情况下使用nullptr过度NULL有益?
在可执行文件的哪个段(.BSS,.DATA,其他)中存储了静态变量,以便它们没有名称冲突?例如:
foo.c: bar.c:
static int foo = 1; static int foo = 10;
void fooTest() { void barTest() {
static int bar = 2; static int bar = 20;
foo++; foo++;
bar++; bar++;
printf("%d,%d", foo, bar); printf("%d, %d", foo, bar);
} }
Run Code Online (Sandbox Code Playgroud)
如果我编译两个文件并将其链接到重复调用fooTest()和barTest的main,则printf语句将独立增加.有意义,因为foo和bar变量是翻译单元的本地变量.
但是存储分配在哪里?
需要明确的是,假设您有一个工具链可以输出ELF格式的文件.因此,我相信,有有将一些空间,对于那些静态变量的可执行文件保留.
出于讨论目的,我们假设我们使用GCC工具链.
要定义整数类型的编译时常量,如下所示(在函数和类范围内),哪种语法最好?
static const int kMagic = 64; // (1)
constexpr int kMagic = 64; // (2)
Run Code Online (Sandbox Code Playgroud)
(1)也适用于C++ 98/03编译器,而(2)至少需要C++ 11.这两者之间还有其他差异吗?在现代C++代码中是否应该首选其中一个,为什么?
编辑
我用Godbolt的CE尝试了这个示例代码:
int main()
{
#define USE_STATIC_CONST
#ifdef USE_STATIC_CONST
static const int kOk = 0;
static const int kError = 1;
#else
constexpr int kOk = 0;
constexpr int kError = 1;
#endif
return kOk;
}
Run Code Online (Sandbox Code Playgroud)
对于这种static const情况,这是GCC 6.2生成的程序集:
main::kOk:
.zero 4
main::kError:
.long 1
main:
push rbp
mov rbp, …Run Code Online (Sandbox Code Playgroud) 在阅读用C++编写的教程和代码时,我经常偶然发现const关键字.
我看到它使用如下:
const int x = 5;
Run Code Online (Sandbox Code Playgroud)
我知道这意味着它x是一个常量变量,可能存储在只读内存中.
但究竟是什么
void myfunc( const char x );
Run Code Online (Sandbox Code Playgroud)
和
int myfunc( ) const;
Run Code Online (Sandbox Code Playgroud)
?
C++ Primer说
在第一次执行通过对象的定义之前,初始化每个本地静态变量.当函数结束时,不会破坏局部静态; 程序终止时它们会被销毁.
局部静态变量与全局静态变量有什么不同?除了声明它们的位置之外,还有什么不同?
void foo () {
static int x = 0;
++x;
cout << x << endl;
}
int main (int argc, char const *argv[]) {
foo(); // 1
foo(); // 2
foo(); // 3
return 0;
}
Run Code Online (Sandbox Code Playgroud)
与之比较
static int x = 0;
void foo () {
++x;
cout << x << endl;
}
int main (int argc, char const *argv[]) {
foo(); // 1
foo(); // 2
foo(); // 3
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我最近static在函数之前看到了关于关键字的SO ,我想知道如何正确使用它.
1)我应该何时static在非成员函数之前编写关键字?
2)在标题中定义静态非成员函数是否危险?为什么不)?
(附带问题)
3)是否可以以某种方式在头文件中定义一个类,以便它只能在您首先使用它的翻译单元中使用?
(我问这个的原因是因为我正在学习STL,它可能是我的谓词等(可能是函子)的一个很好的解决方案,因为我不喜欢在cpp文件中定义除成员函数之外的函数)
(另外,我认为它与原始问题有关,因为根据我目前的推理,它会像static函数之前那样做)
在看到一些答案时出现的另一个问题:
4)很多人告诉我,我必须在头文件中声明静态函数,并在源文件中定义它.但静态函数对于翻译单元是唯一的.链接器怎样才能知道哪些翻译单元是独一无二的,因为头文件不直接涉及到一个源文件(仅当您包括他们)?
我正在读一本关于SIOF的书,它举了一个例子:
//file1.cpp
extern int y;
int x=y+1;
//file2.cpp
extern int x;
int y=x+1;
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:
在上面的代码中,会发生以下事情吗?
我在Visual Studio 2015 sp3中使用C++.通过
#pragma init_seg(compiler)
Run Code Online (Sandbox Code Playgroud)
,我首先初始化一些静态变量(到内存管理). https://msdn.microsoft.com/en-us/library/7977wcck.aspx
但是还有
Run Code Online (Sandbox Code Playgroud)#pragma init_seg(compiler)
在wcerr.cpp(Microsoft Visual Studio 14.0\VC\crt\src\stl\wcerr.cpp)中,所以这些对象在我的对象之前初始化.
我可以wcerr.cpp通过任何编译/链接选项强制我的对象在对象之前被初始化吗?
c++ pragma static-variables visual-studio visual-studio-2015