C 要模拟的弱别名
我试着用英语来模仿一个fn-say-fooC 要模拟的弱别名,c,C,我试着用英语来模仿一个fn-say-foo #ifdef UT_TEST void foo(void) __attribute__ ((weak, alias ("foo_impl"))); #else void foo(void); #endif 但是,有没有办法在@runtime而不是编译时执行此操作?我不能使用C++,因为历史原因。过去,我主要看到这个问题是在构建系统级中解决的,而我觉得这是一个更干净的解决方案。这样做可以避免大多数ifdef,而是使用完整文件。在mak
#ifdef UT_TEST
void foo(void) __attribute__ ((weak, alias ("foo_impl")));
#else
void foo(void);
#endif
但是,有没有办法在@runtime而不是编译时执行此操作?我不能使用C++,因为历史原因。
过去,我主要看到这个问题是在构建系统级中解决的,而我觉得这是一个更干净的解决方案。这样做可以避免大多数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将共享一个头文件。为什么需要在运行时执行此操作?您是否尝试过预加载提供
foo()
mock?@Ben运行时原因,比如我mock malloc()。然后我用malloc()mock调用foo。然后我想用普通malloc()调用bar(),我该如何更改行为?@kgunjikar,不。在Linux中,使用STT\u GNU\u IFUNC解析器函数,通过。