Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 要模拟的弱别名_C - Fatal编程技术网

C 要模拟的弱别名

C 要模拟的弱别名,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

我试着用英语来模仿一个fn-say-foo

#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解析器函数,通过。