首页 > 解决方案 > 使用带有函数原型的预处理器定义

问题描述

我必须处理两个用不同类型名称声明相同原型的头文件(注意最后两种类型相同)

其中之一受#ifndef 指令保护

我正在考虑添加一个定义以避免双重声明,但被告知为定义定义和函数名称使用相同的名称并不是一个好习惯。

acg_header.h

    #ifndef ACos
    /* MATH::ACos/ */
    extern T_Float_user ACos(/* X/ */ T_Float_user X);
    #endif /* ACos */

manual_header.h

    #define ACos // suggested modification
    extern t_float ACos(const t_float X);

我想知道 is 是否是关于 C 实现的正确解决方案。

标签: cc-preprocessoruser-defined-functions

解决方案


您可以有任意数量的相同函数或对象的兼容声明。玩预处理器游戏来避免这种情况是没有必要或有用的。这就是为什么标准方法是在一个(一个)头文件中声明每个函数或全局变量,并且对于访问或定义任何函数或对象的每个源都包含适当的头文件。所以,关于

我必须处理两个用不同类型名称声明相同原型的头文件

,不,你不应该处理那个。应该只有一个标头声明每个函数。尽管如此,如果您确实有两个,并且它们以兼容的方式声明该函数,那么即使声明由于使用了不同但兼容的类型别名而在词法上不匹配,您仍然没有问题。

另一方面,如果您的两个头文件中的声明彼此不兼容,那么您将遇到更深层次的问题。最多可以有一个与函数定义兼容,不能使用其他任何一个。

我正在考虑添加一个定义以避免双重声明,但被告知为定义定义和函数名称使用相同的名称并不是一个好习惯。

同样,您最好的选择是跳过整个练习,但如果您选择继续,那么您需要了解代码中出现的范围内宏标识符将被宏定义替换。因此,预处理的结果是:

#define ACos // suggested modification
extern t_float ACos(const t_float X);

将会

extern t_float (const t_float X);

,因为您已定义ACos扩展为空序列。预处理结果无效。如果您必须遵循此路径,则定义宏以扩展为自己的名称:

#define ACos ACos

然后,您将能够通过#ifdef指令对其进行测试,但您将避免导致预处理器破坏您的程序。但同样,真的,不要这样做。


推荐阅读