c - 如何在 C 中执行条件函数调用?

标签 c function-pointers conditional-compilation

所以我在 C 中做了一些工作,我在汇编和 C 中实现了相同的功能,我想比较 C 与汇编实现的性能。现在,我希望能够有条件地编译和调用函数,即我想创建一个函数,作为调用者和我想调用的正确函数之间的接口(interface)。不知何故,我不确定该怎么做。 我在想下面的某个地方:

//header file containing the C definition and the assembly definition

void getstate(state* m, int* values);   
extern void kalmanstate(state* m, int* values);

然后调用者可以包含上述头文件并传递 &getstate 或 &kalmanstate。

void callTheRightFunction(state* m, int* values, void *fnptr(state*,int*))
{
  *fnptr(m,values);
}

然而,问题是 getstate 和 kalmanstate 都将被编译,这违背了我模拟的目的。在我看来,这不是我想要的包装器的最佳实现。我知道 C 中存在条件执行,但我将如何使用它来获得正确的函数编译?我的意思是如果我在头文件中做这样的事情:

#ifdef __C__FUNC
void getstate(state* m, int *values);
#endif
#ifdef __kalman
void kalmanstate(state *m, int *values)
#endif

然后在调用者中: include "headerfile.h"//包含上面的头文件 //调用者定义_C_FUNC 定义 __C_FUNC callTheRightFunction(m,p,&getstate); 但是因为我在开头包含了头文件,而它们都没有被定义,所以它可能根本不包含任何一个,因此会产生运行时错误。 对正确方向的任何建议将不胜感激。提前谢谢大家!

最佳答案

根据您对原始问题的补充,您想知道是否所有函数都不会被编译。然后你必须在包含头文件之前定义 __C__FUNC__kalman:

#define __C__FUNC
#include "header.h"

但是为了在您没有定义任何东西时避免这个问题,一种方法是让您在 SOURCE 文件中只使用一个定义,就像这样:

#ifdef __GSTATE_USE_C_FUNCTION
void getstate(state* m, int *values)
{
    // C version
}
#else
void getstate(state *m, int *values)
{
    // Assembly version
}
#endif

在头文件上:

void getstate(state *m, int *values);

(注意同一个函数名,调用函数时不需要修改代码)

但这只有在您在源文件中包含 header 的情况下才有效,其中 getstate 也正在实现。 (*1)

然后,如果您忘记在包含 header 之前定义 __GSTATE_USE_C_FUNCTION,则会使用第二个函数,因为它触发了 #else

现在,您可以像这样在两个源文件都包含的头文件(即实现该函数的文件和使用它的文件)上使用它:

// Comment the line below if you want the other version
#define __GSTATE_USE_C_FUNCTION

当然,在包含包含原型(prototype)声明的 header 之前,您必须包含此 header 。

在源文件上:

// Somewhere else on the code where you use the function
getstate(m, values);

因此您只需更改全局 header 上的 #define 行即可。

此外,如果您的编译器可以选择在命令行中为它定义预处理器,那么您甚至不需要在#include 之前定义__GSTATE_USE_C_FUNCTION >,您只需将其用作命令行选项,如下所示(例如在 bcc32 中):

bcc32 /D"__GSTATE_USE_C_FUNCTION" hello.c

这将避免问题 (*1),并且您不必创建两个源文件都必须包含的全局头文件。

关于c - 如何在 C 中执行条件函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12659109/

相关文章:

带有参数作为函数参数的Javascript函数指针

c++ - 如何声明一个常量的方法指针

c++ - 类成员函数作为函数指针

ios - How to subclass a renamed class?/'MKPinAnnotationView' was deprecated in iOS 15.0 : renamed to 'MKMarkerAnnotationView‘

c# - 在分发或编辑器构建中屏蔽某些代码,例如#if defined

计算麦克斯韦-玻尔兹曼分布

c - 读取地址所指向的数据

php - Openssl 和 Windows CryptoAPI 兼容性问题

c - 如何将新应用程序从 Gnome/GTK 生成到 CLI 应用程序并将其输出读回 Gnome/GTK 应用程序?

C++ 在 Windows 和 Linux 上编译 : ifdef switch