相关疑难解决方法(0)

__attribute __((构造函数))究竟是如何工作的?

似乎很清楚它应该设置.

  1. 什么时候它运行?
  2. 为什么有两个括号?
  3. __attribute__功能吗?一个宏?句法?
  4. 这在C中有用吗?C++?
  5. 它的工作功能是否需要是静态的?
  6. 什么时候__attribute__((destructor))跑?

目标C中的示例:

__attribute__((constructor))
static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];
}

__attribute__((destructor))
static void destroy_navigationBarImages() {
  [navigationBarImages release];
}
Run Code Online (Sandbox Code Playgroud)

c c++ gcc objective-c

327
推荐指数
4
解决办法
12万
查看次数

当使用c ++静态初始化程序时,Linux共享库init&deinit

我想要自动调用来初始化和取消初始化我的共享库.

在我的共享库中,我需要对C++对象进行一些静态初始化,其中包括使用第三方代码(例如UnitTest ++).当执行我的init函数时,我需要保证,C++对象(所有链接的翻译单元)的所有静态初始化都已完成(反之亦然); 因此,与main()的执行在C++程序中可以预期的条件相同.

我已经看到很多关于linux共享库init/deinit的信息,例如:

但提供的解决方案不符合我的需求.在两种方法(__attribute__((constructor))甚至-Wl,-init,<function name>)中,似乎在完全完成C++对象的静态初始化之前调用init函数.

我也__attribute__ ((init_priority(…)))喜欢玩:

class InitAndDeinit {
public:
    InitAndDeinit() {
        // Do some initialization
    }
    ~InitAndDeinit() {
        // Do some cleanup
    }
} initAndDeinit __attribute__((init_priority(65535)));
Run Code Online (Sandbox Code Playgroud)

但是,这也不会将呼叫置于期望的位置; 即使有__attribute__((constructor(65535))).

我用gcc 4.6.4,4.7.3和4.8.1进行了测试(4.6.4显示了关于排序的略微不同的行为__attribute__((constructor))).

有什么建议?

我目前的解决方法是提供必须由应用程序手动调用的导出函数(lib_init()和lib_deinit()).

c++ linux gcc initialization shared-libraries

6
推荐指数
1
解决办法
3491
查看次数

加载/卸载时由共享库执行的代码

是否可以在加载(或卸载)库时立即执行的共享库(Windows 上的 .dll 和 linux 上的 .so)中创建函数?

就像 main() 函数是可执行文件的入口点一样,我可以定义一个函数在加载或卸载 DLL 时执行吗?

例如:

void _atstart()
{
    // Initialize some stuff needed by the library
}

void _atexit()
{
    // Release some allocated resources
}
Run Code Online (Sandbox Code Playgroud)

我想我在某处看到过这样的例子,但我再也找不到了,并且在互联网上找不到任何关于此的信息。

如果它有任何用处,我正在用 MinGW 编译代码。

c++ dll shared-libraries

3
推荐指数
1
解决办法
2872
查看次数

如何在空主函数中打印Hello World

我遇到了一件有趣的事情.在一次采访中,我被要求将"Hello World"打印到控制台.但主要功能必须是:

int main(void) 
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它一定不能修改!

c c++ program-entry-point

-2
推荐指数
3
解决办法
299
查看次数