C-使用功能原型的Pre Proceser定义的使用



我必须处理两个标题文件,这些标头文件声明具有不同类型名称的相同原型(请注意,两种类型在末尾是相同的(

其中之一被#IFNDEF指令

保护

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

acg_header.h

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

手动_header.h

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

我想知道是否是有关C实施的正确解决方案。

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

我必须处理两个标题文件,声明具有不同类型名称的相同原型

,不,您不应该处理。应该只有一个标头声明每个功能。但是,如果您确实有两个,并且它们会兼容声明该函数,那么即使声明由于使用不同的(但兼容(键入类型Aliases而没有词汇匹配,您仍然没有问题。

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

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

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

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

将是

extern t_float (const t_float X);

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

#define ACos ACos

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

最新更新