- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
似乎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/
我的问题归结为以下代码: class TaskOneLine(db.Model): userId = db.Column(db.String(64), primary_key=True)
有模型。 class CMiixin(objects): @declared_attr def x(cls): return Column(Float) class A
我正在审查服务器和客户端的一些 WebSocket 实现。 Alchemy WebSocketClient 是否应该能够连接到 ws://echo.websocket.org? WebSocketCl
我正在通过流式处理大量 http 响应内容(100 万条记录)。从请求中读取 10000 个元素后,我调用一个方法将它们插入数据库,然后继续处理响应。我注意到 RAM 使用量在不断增加。下面是示例代码
我想使用 automap pattern 数据库中预先存在的表在。 但是,要能够使用此模式,您需要按照文档中所示设置主键(并亲自尝试;失败,如 this)。 在 sqlalchemy 中是否有任何方法
我是 Flask SQl 炼金术的新手;虽然我知道炼金术抽象了 sql 语法并在创建模型时使事情变得简单;有时我们希望以一种非常特定的方式在前端可视化数据。 我有以下查询,我想使用 alchemy 使
我正在尝试将 pandas 数据帧附加到已创建的表,但我一直收到错误。 我正确连接到服务器。在服务器内部,有很多数据库,然后这个表在db_STAFF数据库中。最初,我在做 df.to_sql(db_S
我正在尝试将以下内容翻译成 sqlalchemy: SELECT COUNT(TableA.id) AS 'number_of_staff' FROM TableA WHERE datediff
我正在尝试使用 SQLalchemy 从 SQL 数据库中查询大量数据。 some_data = db.session.query(some_info1, some_info2).all() for
我正在使用第三方使用 sqlalchemy 创建的现有数据库。但是,我遇到了麻烦,因为表没有主键,更糟糕的是,它们的每一行都有重复的元素,所以我无法选择现有列作为主键。这些表有两列:都具有非唯一值。
更新: 我看到了一些指导 here ,但是当我使用下面的代码将数据从 pandas 插入 Oracle 时,我似乎无法弄清楚如何指定列类型。例如,一列是日期,但在导入时,它会转换为字符串。 另外,如果
我是一名优秀的程序员,十分优秀!