使用#ifdefs进行代码选择会产生难看的构造-替代品吗?

时间:2019-01-22 09:56:39

标签: c++ optimization preprocessor

当前我的代码大致类似于

#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

2 个答案:

答案 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(即定义AB和{{ 1}}宏。

编辑:这可能是@Baruch在另一个答案中评论的内容。发布答案后,我看到了他的评论。