相关疑难解决方法(0)

"静态"在C中意味着什么?

static在C代码中看到了不同地方使用的单词; 这就像C#中的静态函数/类(其中实现是跨对象共享的)?

c syntax static

1062
推荐指数
15
解决办法
86万
查看次数

如何在C++中初始化私有静态成员?

在C++中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这个,但它给了我奇怪的链接器错误:

class foo
{
    private:
        static int i;
};

int foo::i = 0;
Run Code Online (Sandbox Code Playgroud)

我猜这是因为我无法从课外初始化私人成员.那么最好的方法是什么?

c++ initialization static-members

492
推荐指数
11
解决办法
47万
查看次数

NULL vs nullptr(为什么它被替换?)

我知道在C++中0x或者NULLnullptr基于指针的应用程序所取代.我只是好奇他们为什么要更换它?

在处理指针时,在什么情况下使用nullptr过度NULL有益?

c++ null pointers nullptr

176
推荐指数
4
解决办法
14万
查看次数

静态变量存储在C和C++中的哪个位置?

在可执行文件的哪个段(.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工具链.

c c++ compiler-construction

169
推荐指数
10
解决办法
18万
查看次数

constexpr与静态const:哪一个更喜欢?

定义整数类型的编译时常量,如下所示(在函数和类范围内),哪种语法最好?

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 constexpr c++11

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

C++"const"关键字解释

在阅读用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++ const constants

34
推荐指数
2
解决办法
4万
查看次数

关于C++中的局部和全局静态变量

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)

c++ static

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

我什么时候应该在非成员函数之前写关键字'static'?

我最近static在函数之前看到了关于关键字的SO ,我想知道如何正确使用它.

1)我应该何时static在非成员函数之前编写关键字?

2)在标题中定义静态非成员函数是否危险?为什么不)?


(附带问题)

3)是否可以以某种方式在头文件中定义一个类,以便它只能在您首先使用它的翻译单元中使用?

(我问这个的原因是因为我正在学习STL,它可能是我的谓词等(可能是函子)的一个很好的解决方案,因为我不喜欢在cpp文件中定义除成员函数之外的函数)

(另外,我认为它与原始问题有关,因为根据我目前的推理,它会像static函数之前那样做)

编辑

在看到一些答案时出现的另一个问题:

4)很多人告诉我,我必须在头文件中声明静态函数,并在源文件中定义它.但静态函数对于翻译单元是唯一的.链接器怎样才能知道哪些翻译单元是独一无二的,因为头文件不直接涉及到一个源文件(仅当您包括他们)?

c++ linker static

23
推荐指数
2
解决办法
8279
查看次数

静态初始化命令fiasco

我正在读一本关于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)

现在我的问题是:
在上面的代码中,会发生以下事情吗?

  1. 编译file1.cpp时,编译器保留原样,即不为它分配存储空间.
  2. 编译器为x分配存储空间,但不对其进行初始化.
  3. 编译file2.cpp时,编译器会保留x,即不为它分配存储空间.
  4. 编译器为y分配存储空间,但不对其进行初始化.
  5. 在链接file1.o和file2.o时,现在先让file2.o初始化,现在:
    x的初始值是否为0?或者没有初始化?

c++ dependencies initialization static-order-fiasco

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

我可以在C++中更改静态变量初始化顺序吗?

我在Visual Studio 2015 sp3中使用C++.通过

#pragma init_seg(compiler)
Run Code Online (Sandbox Code Playgroud)

,我首先初始化一些静态变量(到内存管理). https://msdn.microsoft.com/en-us/library/7977wcck.aspx

但是还有

#pragma init_seg(compiler)
Run Code Online (Sandbox Code Playgroud)

在wcerr.cpp(Microsoft Visual Studio 14.0\VC\crt\src\stl\wcerr.cpp)中,所以这些对象在我的对象之前初始化.

我可以wcerr.cpp通过任何编译/链接选项强制我的对象在对象之前被初始化吗?

c++ pragma static-variables visual-studio visual-studio-2015

15
推荐指数
1
解决办法
1123
查看次数