gpt4 book ai didi

flash - 全局变量被炼金术打破了?

转载 作者:行者123 更新时间:2023-12-02 02:30:03 26 4
gpt4 key购买 nike

似乎Adobe Alchemy没有运行全局构造函数。下面是一些简单的测试代码:

#include <stdio.h>

class TestClass {
public:
TestClass(const char message[]) {
printf("hello %s \n", message);
}
};

TestClass global("global");

int main(int argc, char **argv) {
TestClass local("local");
printf("in main\n");
return 0;
}

当使用 native gcc 编译时,它输出:

hello global
hello local
in main

当使用 alchemy gcc 编译时,它输出:

hello local
in main

这个问题破坏了很多代码,特别是 UnitTest++ (这取决于全局变量是否被初始化以使其自动测试列表功能起作用)。

我真的很想弄个水落石出。它是一个错误还是一个功能没有在发布时及时实现?是否可以解决?

编辑:Adobe 论坛上的相关帖子是here .

最佳答案

我遇到了同样的问题。据我所知,情况似乎是这样:

即使是单个类在其初始化期间的任何时候尝试动态分配,每个类类型的静态和全局变量都将静默初始化失败。这大概是因为 ByteBuffer 被用于动态内存尚不可用。我希望 Alchemy 的错误消息更加清晰,因为目前它就像一串老式的圣诞灯,其中一个灯泡坏了会导致整串灯熄灭。

解决方法是,一旦发现有问题的对象,您需要以某种方式将其初始化推迟到运行时。我想到的三种技术是指针、惰性求值函数或对使用新放置初始化的缓冲区的引用。

指针

// `global` is now a pointer
TestClass *global;

// all global variable initialization is found here now
void init_globals() {
global = new TestClass("global");
}

int main(int argc, char **argv) {
// this needs to be explicitly called at the start Alchemy
init_globals();

然后您需要重构您的代码,将每次出现的 global 更改为 (*global)

函数

// `global` is now a function
TestClass& global() {
// static locals are initialized when their functions are first called
static TestClass global_("global");
return global_;
}

现在您需要用 global() 替换所有出现的 global。值得注意的是,这是这三种技术中唯一不需要显式 init_globals 调用的技术。我推荐这种方式,除非由于某种原因将名称更改为 global() 很麻烦......在这种情况下:

放置新

// a memory buffer is created large enough to hold a TestClass object
unsigned char global_mem[sizeof(TestClass)];
// `global` is now a reference.
TestClass& global = *(TestClass*)(void*)global_mem;

void init_globals() {
// this initializes a new TestClass object inside our memory buffer
new (global_mem) TestClass("global");
}

int main(int argc, char **argv) {
init_globals();

这种方法的优点是您不需要更改任何其他代码,因为 global 仍然只是称为 global。不幸的是,维护 init_globals 函数可能很麻烦。


编辑:
在后面的问题中发现,除了动态分配之外,在 Alchemy 的初始化过程中也无法调用包含静态局部变量的函数。

关于flash - 全局变量被炼金术打破了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4169892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com