使用__attribute__((constructor))
和__attribute__((destructor))
定义的GCC共享库构造函数和析构函数是否保证只运行一次?文档似乎暗示它们将至少运行一次,但不会多次提及任何内容。
换句话说,如果我在构造函数中执行必须只执行一次的操作,我是否需要像这样保护它:
static gboolean constructor_has_run = FALSE;
if(!constructor_has_run) {
do_operation();
constructor_has_run = TRUE;
}
答案 0 :(得分:2)
如果使用__attribute__((constructor))
,将在执行开始时调用它。
所以你不必像上面提到的那样保护。
如果你提到它没有错误
有关__attribute__((constructor))
的更多信息,您可以查看https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
答案 1 :(得分:0)
如果有人想在标头中使用此类函数,则该观察可能会很有用:如果函数定义如下
__attribute__((constructor)) inline void fn()
{ ... }
以N个翻译单位为单位,将被称为N次。