zoukankan      html  css  js  c++  java
  • c构造函数

    构造函数

      任何一们面向对象语言里都会涉及构造函数这一概念,只是实现的方式各有差异。需要这main函数之前执行一段代码是非常容易的事情,只需要声明一对象的全局变量,在构造函数可以为所欲为干你想干的事情。然而,对于面向过程的语言比如C,需要实现全局的构造函数就比较奇葩。当然gcc会有很优雅的解决方式,VC则猥琐点。

    为何需要这个

      其实在main函数里面调用一下就可以了,是的,这样是可以,但是对于框架的实现来说,这却是不太好的,客户使用起来不自由。当然也可以说,我是屌丝,我可以装逼点。

    如何实现

    • gcc实现
      gcc 实现是非常简单的事情。在全局构造函数前叫以下编译器属性即可:
      attribute((constructor))

    • vc实现
      vc的实现比较奇葩,VC本身没有类似·attribute·这样的属性,你需要将全局函数编译到某个特定的代码段里面。MSDN对于这部分有详细的说明:CRT Initialization
      简单来说就是将你的全局构造函数的函数指针编译到·.CRT$XCU·段里面。如何编译到·.CRT$XCU·段?VC有VC的语法。

    // 声明在段·.CRT$XCU·里面生成代码    
    #pragma section(".CRT$XCU",read)    
    // 声明需要调用的函数    
    __declspec(allocate(".CRT$XCU")) void (\_\_cdecl *a)(void) = func;    
    // 调用的函数实现    
    void func(void){}    
    

    以上实现可以用下面实现:

    #ifdef _MSC_VER    
    #define __CCALL __cdecl    
    #define __func__ __FUNCTION__    
    #define snprintf _snprintf    
    #pragma warning(disable:4996) // this is very violent    
    #pragma section(".CRT$XCU",read)
    #define __CONSTRCT(a, b)                                                 
      void __CCALL __##a##__##b##__ ## 520hjm(void);                       
      __declspec(allocate(".CRT$XCU"))                                     
      void (__CCALL * __ctor__##a##__##b##__ ## 520hjm)(void) =            
      __##a##__##b##__ ## 520hjm;    
    #else    
    #define __CCALL    
    #define __CONSTRCT(a, b) __attribute__((constructor))    
    

    额外参考

    仿照gtest的简易单元测试ctest就是用的这方面的知识。

    这里显示效果不是很好,个人网站那里效果好点http://luoguochun.cn/2014/06/25/c-constructor/

  • 相关阅读:
    The usage of Markdown---杂谈:缩进/换行/分割线/注释/文字颜色
    insert into,insert into select,replace into,replace into select,insert ignore into,on duplicate key update
    mysql使用指南
    openssl使用
    黑名单
    zsh+iTerm2+ powerline+oh-my-zsh+ agnoster
    mac安装brew软件管理工具
    mysql性能优化
    numactl
    vscode
  • 原文地址:https://www.cnblogs.com/imlgc/p/3808507.html
Copyright © 2011-2022 走看看