当前我的代码大致类似于
#ifdef A
#include "include_a.h"
#endif
#ifdef B
#include "include_b.h"
#endif
void func_A()
{
#ifdef A
do_stuff_a();
#endif
}
void func_B()
{
#ifdef B
do_stuff_b();
#else
do_other_stuff();
#endif
}
void func_C()
{
do_stuff_c();
}
int main(void)
{
#ifdef A
#ifdef B
do_AB_stuff();
#else
do_A_stuff();
#endif
func_A();
func_B();
func_C();
return 0;
}
原因是:我正在使用cmake链接其他库/标题。如果链接了这些头文件/库,则调用包含的函数是有意义的,否则,编译将失败。这使我可以在有或没有其他库的情况下运行程序(例如,如果我只想测试func_C()
,而没有func_B()
和func_A()
的计算量,或者如果有库A和B在系统上不可用。
尽管如此,这仍然使代码变得很丑陋,周围有很多#ifdefs
。因此,有没有办法获得相同的功能(最好是由cmake脚本控制),而不必使用所有这些#ifdefs
?
答案 0 :(得分:1)
根据库A和B的大小,您可以编写存根库,而存根库的功能不执行任何操作或返回硬编码的值或任何有意义的函数。然后,您可以链接到真实库或存根库以测试 Option Explicit
Sub VlookUp()
Dim LastRowSV As Long, LastRowV As Long, Counts As Long
Dim wsName As String
Dim wsListSV As Range, cellSV As Range, wsListV As Range, cellV As Range
With ThisWorkbook.Worksheets("Sheet1")
'Find the last row of Search Values
LastRowSV = .Cells(.Rows.Count, "D").End(xlUp).Row
'Find the last row of Values
LastRowV = .Cells(.Rows.Count, "A").End(xlUp).Row
'Set the list with the Search Values
Set wsListSV = .Range(Cells(2, 4), Cells(LastRowSV, 4))
'Set the list with the Values
Set wsListV = .Range(Cells(3, 1), Cells(LastRowV, 1))
'Loop each value in Search Values
For Each cellV In wsListV
Counts = Application.WorksheetFunction.CountIf(wsListSV, cellV)
If Counts <> 0 Then
cellV.Offset(0, 1).Value = "T"
Else
cellV.Offset(0, 1).Value = "F"
End If
Next
End With
End Sub
例如,如果真实库的API只是
func_C()
您的存根可能是:
include_a.h:
void do_stuff_a();
void do_A_stuff();
然后,您可以摆脱所有stub_a.cpp:
void do_stuff_a() {}
void do_A_stuff() {}
,如果不使用库,只需链接到存根文件即可。
答案 1 :(得分:0)
您可以创建所谓的存根库/实现,然后决定是链接到该库还是具有实际实现的库。
文件a_stub.c
:
#include "include_a.h"
void func_A() {} // Does nothing. Returns a placeholder value if necessary.
文件a_real.c
:
#include "include_a.h"
void func_A() { do_stuff_a(); }
与B和C相同。然后根据您的兴趣选择*_real.c
或*_stub.c
(即定义A
,B
和{{ 1}}宏。
编辑:这可能是@Baruch在另一个答案中评论的内容。发布答案后,我看到了他的评论。