按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__
,因为声明和实现必须相同。
有什么想法吗?
答案 0 :(得分:0)
您不需要将实际符号作为全局符号,因此需要使其唯一。 static
符号应该可以正常工作:
static void file_init_() ((constructor)) ;
static void file_init_()
{
printf("Good Morning, %s!\n", __FILE__);
}
或者,如果你坚持,你可以将你的全局函数放入一个匿名命名空间,编译器将确保每个翻译单元都是唯一的。