我试图在Windows和Linux机器上的套件中添加testingfunction。 在Linux机器上,我想要添加真正的function,并在Windows机器上我想要添加虚拟UnsupportedFunction,以便我可以在这两个环境上具有相同数量的function。
我有以下代码
void UnsupportedFunction(struct1* test) { //dummy function in C } // following functions defined else where and gets added only if its linux box #if ENV_LINUX extern void linuxOnlyFunc1(struct1* test); extern void linuxOnlyFunc2(struct1* test); extern void linuxOnlyFunc3(struct1* test); extern void linuxOnlyFunc4(struct1* test); #endif static struct1* addTest(params, TestFunction fnPtr) { ... } static void addTestToSuite (struct1* suite, input devices, TestFunction testFunction, const char* testName, const char* testDescription) { TestFunction fnPtr = UnsupportedFunction; #if ENV_LINUX fnPtr = linuxOnlyFunc1; #endif LinWB_Util_AddTest(params, fnPtr); }
这个问题是因为我有很多的testing要添加到套件,我必须做一个丑陋的if – 定义在所有的条目。 为了摆脱这些我不得不用抽象的函数调用,但那些externsfunction不存在于Windows环境,我最终得到编译器错误或警告(认为错误)。 怎样才能更好地devise这个呢?
感觉如何?
#if ENV_LINUX extern void linuxOnlyFunc1(struct1* test); extern void linuxOnlyFunc2(struct1* test); extern void linuxOnlyFunc3(struct1* test); extern void linuxOnlyFunc4(struct1* test); #else #define linuxOnlyFunc1 UnsupportedFunction #define linuxOnlyFunc2 UnsupportedFunction ... #endif
我没有测试过,所以可能需要一些调整,但你可以做这样的事情:
#if ENV_LINUX #define linux_only(x) extern void x(struct1* test); #else #define linux_only(x) inline void x(struct1* test) { UnsupportedFunction(test); } #endif linux_only(linuxOnlyFunc1); linux_only(linuxOnlyFunc2); linux_only(linuxOnlyFunc3); linux_only(linuxOnlyFunc4);
你可以使用包含文件来存储你的函数声明。 因此,您不必将其写入每个源文件。 如果这些函数变成未定义的,那就写这样的函数吧。
根据要求,我详细说明。
你创建一个名为“fakefuns.h”的文件,其中包含你的函数声明:
#if ENV_LINUX extern void linuxOnlyFunc1(struct1* test); extern void linuxOnlyFunc2(struct1* test); extern void linuxOnlyFunc3(struct1* test); extern void linuxOnlyFunc4(struct1* test); #endif
然后,您可以通过添加将这些定义包含在每个源文件中
#include "fakefuns.h"
进入源文件,最好靠近第一行。 而在一个源文件中,你实际上实现了Linux和Windows的这些功能。 如果他们不应该在Windows中工作,那么实现将非常简单。