使用预处理器定义和功能原型

时间:2019-07-03 12:44:23

标签: c c-preprocessor user-defined-functions

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

其中一个受#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);

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

1 个答案:

答案 0 :(得分:1)

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

  

我必须处理两个头文件,它们声明具有不同类型名称的同一原型

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

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

  

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

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

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

将会

extern t_float (const t_float X);

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

#define ACos ACos

您将可以通过#ifdef指令对其进行测试,但是可以避免使预处理器破坏程序。但是,实际上,完全不要这样做。