Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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++;静态init失败示例 学习C++中“C++思想”的帮助,学习第32章第10章。 问题是如何更改链接顺序,即为对象m5调用的Mirror::test()返回false。 这是我的密码 镜像h:_C++_Static Initialization - Fatal编程技术网

c++;静态init失败示例 学习C++中“C++思想”的帮助,学习第32章第10章。 问题是如何更改链接顺序,即为对象m5调用的Mirror::test()返回false。 这是我的密码 镜像h:

c++;静态init失败示例 学习C++中“C++思想”的帮助,学习第32章第10章。 问题是如何更改链接顺序,即为对象m5调用的Mirror::test()返回false。 这是我的密码 镜像h:,c++,static-initialization,C++,Static Initialization,任务 1.cpp 2.cpp 3.cpp 等等。最后, 5.cpp #包括“mirror.h” #包括 外镜m4; 镜像m5和m4; int main(int argc,char*argv[]){ std::cout在将对象文件传递到链接器时,您需要更改它们的顺序。这对于顶级代码来说是合理的,尽管不同的编译器使用不同的方法,例如,它是不可移植的。此外,对于库,您通常无法控制包含对象的顺序。例如,如果 // file1.cpp int main() { } // file2.cpp #inclu

任务

1.cpp 2.cpp 3.cpp 等等。最后,

5.cpp
#包括“mirror.h”
#包括
外镜m4;
镜像m5和m4;
int main(int argc,char*argv[]){

std::cout在将对象文件传递到链接器时,您需要更改它们的顺序。这对于顶级代码来说是合理的,尽管不同的编译器使用不同的方法,例如,它是不可移植的。此外,对于库,您通常无法控制包含对象的顺序。例如,如果

// file1.cpp
int main() {
}

// file2.cpp
#include <iostream>
static bool value = std::cout << "file2.cpp\n";

// file3.cpp
#include <iostream>
static bool value = std::cout << "file3.cpp\n";
对于
tst1
tst2
,您将获得不同的输出,例如:

$ ./tst1
file2.cpp
file3.cpp
$ ./tst2
file3.cpp
file2.cpp
总的道理是:不要这样做。也就是说:不要使用全局对象。如果您觉得绝对需要使用全局对象,请将它们封装到函数中,例如:

Type& global_value() {
    static Type value; // possibly with constructor arguments
    return value;
}

这样,
value
在第一次被访问时就被初始化了,并且在它还没有被构造的时候,还无法访问它。如果你像这样封装所有对象,你可以保证它们是以适当的顺序构造的(除非你有一个循环依赖,在这种情况下,它无法工作,你应该认真重新考虑你的设计)遗憾的是,在C++ 2003中,将对象封装到函数中不是线程安全的,但是它在C++ 2011中是线程安全的。但是,全局变量的使用通常是有问题的,并且你肯定想最小化它们的使用。

< P>我也在努力练习。

我设法编写了一个小Python脚本来准备makefile条目,该条目使用所有可能的对象文件排列来链接和测试最终可执行文件:

import itertools

for perm in itertools.permutations([1, 2, 3, 4, 5]):
    print '\tg++ u0{0}.o u0{1}.o u0{2}.o u0{3}.o u0{4}.o -o $@ && ./main.exe'.format(*perm)
执行make过程后,所有可能的配置都产生了
true

这是因为,在进入
main
函数之前,所有全局(即静态)变量都保证被初始化

我在
main
之前定义了一个全局
bool
变量,该变量保存
test()
函数的结果,如下所示:

g++ -o tst1 file1.cpp file2.cpp file3.cpp
g++ -o tst2 file1.cpp file3.cpp file2.cpp
#include "mirror.h"

#include <iostream>

extern Mirror m4;
Mirror m5 (&m4);

bool result = m5.test();

int main(int argc, char* argv[]) {
  std::cout << result << std::endl;
}
#包括“mirror.h”
#包括
外镜m4;
镜像m5和m4;
bool result=m5.test();
int main(int argc,char*argv[]){

std::难道我不确定这有多有用。只编写代码就容易多了,这样它就不会在一开始就做初始化顺序之类的事情。@锑:嗯……这是练习的目标,暴露问题,所以我想说OP知道它。@Mat我知道,这对我来说似乎不是一个有用的练习。我从来没有做过它在我所做的任何C++项目中都有。@安蒂莫尼:有时人们需要首先体验一个问题来承认它确实存在:“我到底尝试使用什么优先权”?意思?你能告诉我们如何吗?到你的顶端!我不能强调这在C++中有多么重要。我不会透露我愤怒的次数,直到我发现为什么我的指针无效,因为这是一个很常见的问题。
g++ -o tst1 file1.cpp file2.cpp file3.cpp
g++ -o tst2 file1.cpp file3.cpp file2.cpp
$ ./tst1
file2.cpp
file3.cpp
$ ./tst2
file3.cpp
file2.cpp
Type& global_value() {
    static Type value; // possibly with constructor arguments
    return value;
}
import itertools

for perm in itertools.permutations([1, 2, 3, 4, 5]):
    print '\tg++ u0{0}.o u0{1}.o u0{2}.o u0{3}.o u0{4}.o -o $@ && ./main.exe'.format(*perm)
#include "mirror.h"

#include <iostream>

extern Mirror m4;
Mirror m5 (&m4);

bool result = m5.test();

int main(int argc, char* argv[]) {
  std::cout << result << std::endl;
}