首页 > 解决方案 > 程序启动时立即运行的 C++ 代码

问题描述

struct First{
    First(){
        printf("first");
    }
}First;

int main()
{
    print("second");
    return 0;
}

我知道我可以通过结构控制首先执行的代码。
所以我想用下面的代码通过宏使它变得简单。

#define FIRST_INVOKE(NAME,FUNCTION) \
struct NAME  \
{ \
    NAME() \
    { \
        FUNCTION(); \
    } \
} NAME;
namespace Foo
{
    namespace Bar
    {
        void FirstFunction()
        {
            LOGD(LVID, "First");
        }
    }
}
FIRST_INVOKE(UniqueStructName, Foo::Bar::FirstFunction);

创建宏时,必须指定结构的名称。(UniqueStructName)
我想将其设置为不会自动全局重叠的名称。

命名空间和类静态函数不能包含在结构名称中,因为 :: 是必需的。

请让我知道是否有好的方法(我正在使用 Xcode。)

标签: c++

解决方案


您可以根据行号自动生成名称并使用匿名命名空间来避免跨文件的多个定义。例如,使用以下宏:

#define CONCAT_(A,B) A##B
#define CONCAT(A,B) CONCAT_(A,B)
#define NONAME() CONCAT(noname_, __LINE__)
#define FIRST_INVOKE(FUNCTION) \
namespace {                          \
    struct NONAME() \
    { \
        NONAME()() \
        { \
            FUNCTION(); \
        } \
    } NONAME();                      \
}

这将扩展为一个noname_X结构,其中X是行号。只要您不在同一行上重复宏,这将起作用。


推荐阅读