C中的条件编译,当函数使用automake具有不同的原型时

时间:2013-10-19 10:51:46

标签: c automake

ibv_modify_qp函数对于不同版本的库有2个不同的签名。 两个库都将头文件安装在同一位置。以下是2个版本。

int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
              int attr_mask);
int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
              enum ibv_qp_attr_mask attr_mask);

在我的库中,我将我的驱动程序特定函数的指针传递给ibv_context_ops结构。

/*ibv_context_ops field contains function pointers to driver specific functions*/

static struct ibv_context_ops c4iw_ctx_ops = {
    .modify_qp = c4iw_modify_qp,
    }
int c4iw_modify_qp(struct ibv_qp *ibqp, struct ibv_qp_attr *attr,
               int attr_mask);

因此,当原型匹配时,我没有看到任何警告,但是当原型不同时,将生成警告。 现在我正在使用CFLAGS进行有条件的编译,如下所示。

#ifdef IBV_VER2

int c4iw_modify_qp(struct ibv_qp *ibqp, struct ibv_qp_attr *attr,
               int attr_mask);

#else

int c4iw_modify_qp(struct ibv_qp *ibqp, struct ibv_qp_attr *attr,
               enum ibv_qp_attr_mask attr_mask);
#endif

无论如何,我可以利用gnu automake检查函数原型并根据库头文件中定义的函数原型替换函数参数。

1 个答案:

答案 0 :(得分:2)

功能原型实际上是相同的。传递给函数的整数和枚举值之间没有实际区别。所以在你的情况下你根本不需要做任何编译魔术。如果您提供有关编译器警告的更多详细信息,我将修改答案。

  

无论如何,我可以利用gnu automake检查函数原型并根据库头文件中定义的函数原型替换函数参数。

如果你真的有不同的API,你可以简单地创建一个只用其中一个版本编译的最小程序。程序是否编译,然后可以用作条件编译的基础。

请参阅:http://www.gnu.org/software/autoconf/manual/autoconf.html#Running-the-Compiler

示例:https://svn.apache.org/repos/asf/xerces/c/trunk/configure.ac