3
我試圖嘲弄一個FN,有沒有辦法做到這一點@運行時,而不是編譯時?出於歷史原因,我無法使用C++。弱別名說foo的使用</p> <pre><code>#ifdef UT_TEST void foo(void) __attribute__ ((weak, alias ("foo_impl"))); #else void foo(void); #endif </code></pre> <p>但是嘲笑
我試圖嘲弄一個FN,有沒有辦法做到這一點@運行時,而不是編譯時?出於歷史原因,我無法使用C++。弱別名說foo的使用</p> <pre><code>#ifdef UT_TEST void foo(void) __attribute__ ((weak, alias ("foo_impl"))); #else void foo(void); #endif </code></pre> <p>但是嘲笑
在過去,我主要在構建系統級別上看到這個問題,而我認爲這是一個更乾淨的解決方案。這樣做可以避免大多數ifdefs,而是使用完整文件。在化妝,它可能是這個樣子:
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()'模擬的共享庫? –
@Ben運行時的原因,可以說我模擬malloc()。然後我用malloc()調用foo來模擬。之後我想用正常的malloc()調用bar(),我該如何改變行爲? – kgunjikar