在main之前立即调用函数

时间:2011-03-07 16:15:02

标签: c++ function callback main

是否可以在输入main之前注册要立即运行的功能?我知道所有全局对象都是在输入main之前创建的,所以我可以将代码放在全局对象的构造函数中,但这并不能保证任何特定的顺序。我想做的是将一些注册码放入构造函数中,但是,我不知道该放什么:)我想这是高度系统特定的?

4 个答案:

答案 0 :(得分:9)

如果您使用的是gcc,则可以使用函数的constructor属性在main之前调用它(有关详细信息,请参阅documentation)。

  

constructor

     

destructor

     

constructor属性导致在执行main ()之前自动调用该函数。同样,destructor属性会导致在main ()完成或exit ()被调用后自动调用该函数。具有这些属性的函数对于初始化将在程序执行期间隐式使用的数据非常有用。

答案 1 :(得分:2)

不确定这正是你想要的......但它应该可以胜任。

int main() {
  static int foo = registerSomething();
}

最好在主要或首次访问时显式调用此类注册函数(但如果您是多线程的话,第一次访问init可能会出现问题)。

答案 2 :(得分:1)

我在这里猜测但是:

  1. 您希望在不同的编译单元中注册某些内容
  2. 您遇到了注册问题,因为您正在保存注册的全局变量尚未构建。
  3. C ++定义函数静态在首次访问之前的某个时间初始化,因此您可以按照下面所示的方式解决它。

    typedef std::map<std::string, std::string> RegistrationCache;
    
    RegistrationCache& get_string_map()
    {
        static RegistrationCache cache;
        return cache;
    }
    
    class Registration
    {
        Registration(std::string name, std::string value)
        {
            get_string_map()[name] = value;
        }
    };
    

答案 3 :(得分:0)

目标

假设你想要以下内容:

STATIC_EXECUTE {
  printf("This probably prints first"\n");
}

STATIC_EXECUTE {
  printf("But order isn't guaranteed in the language spec, IIRC"\n");
}

int main(int argc, char **argv) {
  printf("This definitely prints last. Buh Bye.\n");
}

实施

C ++版本 - 静态变量+构造函数:

// This is some crazy magic that produces __StaticExecute__247
// Vanilla interpolation of __StaticExecute__##__LINE__ would produce __StaticExecute____LINE__
// I still can't figure out why it works, but it has to do with macro resolution ordering
// If you already have Boost, you can omit this part
#define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)
#define BOOST_PP_CAT_I(a, b) BOOST_PP_CAT_II(~, a ## b)
#define BOOST_PP_CAT_II(p, res) res

// This avoids repeating the BOOST_PP_CAT 5X
#define STATIC_EXECUTE \
  STATIC_EXECUTE_I(BOOST_PP_CAT(__StaticExecute__, __LINE__))

// This is the meat, a static instance of a class whose constructor runs your code
#define STATIC_EXECUTE_I(uniq_name)               \
static struct uniq_name {                         \
  uniq_name();                                    \
} BOOST_PP_CAT(uniq_name, __var);                 \
uniq_name::uniq_name()  // followed by { ... }

C版 - 静态变量+函数

// ... 

// The meat: a static variable initialized from a function call
#define STATIC_EXECUTE_I(uniq_name)            \
static void uniq_name ();                      \
static int BOOST_PP_CAT(uniq_name, __var) =    \
  (uniq_name(), 0);                            \
static void uniq_name()                        // followed by { ... }

注释

  • 恕我直言,C ++版本略显优雅。在理论上,它消耗的空间略小。否则,土豆,po-tat-o​​h。

  • 警告:我没有在适当的C-only编译器上测试“C”版本。手指交叉;如果不起作用,请张贴。

  • 警告:编译器的可移植性通常是一件棘手的事情。如果其他编译器出现错误,我不会感到震惊。

  • BOOST_PP_CAT代码从boost/preprocessor/cat.hpp被盗。我简化了实现,并且在此过程中可能已经损害了可移植性。如果它不起作用,请尝试原始(更详细)的实现,并在下面发表评论。或者,如果您已经在使用Boost,则可以使用他们的版本。

  • 如果您正在尝试了解Boost魔法,请注意(至少对我而言,在这种情况下),以下似乎也有效:

    #define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)
    #define BOOST_PP_CAT_I(a, b) a ## b