定义一个带文件名的宏

时间:2016-07-01 12:30:27

标签: c++ macros static-initialization

finding-c++-static-initialization-order-problems, 我想在头文件中定义一个宏,例如“check_fiasco.h”,然后把这个头文件放到每个cpp文件的顶部,就像Warren Stevens的想法一样。但是,我在linux下尝试了他的代码,它不起作用(它编译,但在执行时崩溃)。

我尝试了以下宏:

#define TOKENCONCAT(x, y) x ## y
#define file_init_(x, y) TOKENCONCAT(x, y)
#define FIASCO_FINDER_DEC \
     void file_init_(file_, __FILE__)(void) ((constructor)) ;

#define FIASCO_FINDER_IMPL \
     void file_init_(file_, __FILE__)(void) __attribute__ {\
        printf("Good Morning, %s!\n", __FILE__);\
        return ;\
     }

但是,这不起作用,因为函数名称不允许使用带有“/”的粘贴文件名。我也不能使用__COUNTER__,因为声明和实现必须相同。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您不需要将实际符号作为全局符号,因此需要使其唯一。 static符号应该可以正常工作:

static void file_init_() ((constructor)) ;

static void file_init_()
{
    printf("Good Morning, %s!\n", __FILE__);
}

或者,如果你坚持,你可以将你的全局函数放入一个匿名命名空间,编译器将确保每个翻译单元都是唯一的。