这个问题是由于ATmel处理器的ELF文件格式不支持全局构造函数。为了避免这个问题,可以使用AVR-GCC作为编译器,而不是LLVM。或者,也可以使用特殊的标记来确保在链接时调用全局构造函数。以下是一个示例,显示了如何使用标记在ATmel处理器上调用全局构造函数:
#include
using namespace std;
typedef void (*func_ptr)();
namespace {
class GlobalCtor {
public:
GlobalCtor(func_ptr f) { f(); }
};
GlobalCtor ctor1([]() { cout << "Global constructor called 1." << endl; });
}
// This function is tagged with the constructor attribute, so it will be called
// automatically at program startup, which should cause the constructor above to
// be called as well.
__attribute__((constructor)) void run_func_ptrs() {
cout << "Calling function pointers..." << endl;
}
int main() {
cout << "Program started." << endl;
return 0;
}
在这个示例中,定义了一个只在编译单元内部可见的类GlobalCtor。这个类会在构造时调用其构造函数参数中传递的函数指针。这个函数指针所代表的函数就是全局构造函数。在这个示例中,使用lambda表达式定义了一个全局构造函数,并将其传递给了GlobalCtor的构造函数。
为了确保在程序启动时调用全局构造函数,使用了一个特殊的构造函数标记__attribute__((constructor))来修饰run_func_ptrs函数。这样,在程序启动时,编译器会自动调用run_func_ptrs函数,这将导致全局构造函数也被调用。