我试图使用
模仿fn说foo#ifdef UT_TEST
void foo(void) __attribute__ ((weak, alias ("foo_impl")));
#else
void foo(void);
#endif
但是,有没有办法在@ runtime而不是编译时执行此操作?由于历史原因,我无法使用C ++。
答案 0 :(得分:1)
过去我经常看到这个问题在构建系统级别解决了,我认为这是一个更清洁的解决方案。这样做可以避免大多数ifdef,而是使用完整文件。在make中,它可能看起来像这样:
OBJS += file1.o file2.o
ifeq ($(UNIT_TEST),y)
OBJS += dummy_implementation.o
else
OBJS += real_implementation.o
endif
myprog: $(OBJS)
或更经典的成语:
OBJS-y += file1.o file2.o
OBJS-$(UNIT_TEST) += dummy_implementation.o
OBJS-$(REAL_BUILD) += real_implementation.o
OBJS = $(OBJS-y)
myprog: $(OBJS)
在这种情况下,dummy_implementation.c和real_implementation.c会共享一个头文件。