c - 使用带有函数原型的预处理器定义
问题描述
我必须处理两个用不同类型名称声明相同原型的头文件(注意最后两种类型相同)
其中之一受#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 实现的正确解决方案。
解决方案
您可以有任意数量的相同函数或对象的兼容声明。玩预处理器游戏来避免这种情况是没有必要或有用的。这就是为什么标准方法是在一个(一个)头文件中声明每个函数或全局变量,并且对于访问或定义任何函数或对象的每个源都包含适当的头文件。所以,关于
我必须处理两个用不同类型名称声明相同原型的头文件
,不,你不应该处理那个。应该只有一个标头声明每个函数。尽管如此,如果您确实有两个,并且它们以兼容的方式声明该函数,那么即使声明由于使用了不同但兼容的类型别名而在词法上不匹配,您仍然没有问题。
另一方面,如果您的两个头文件中的声明彼此不兼容,那么您将遇到更深层次的问题。最多可以有一个与函数定义兼容,不能使用其他任何一个。
我正在考虑添加一个定义以避免双重声明,但被告知为定义定义和函数名称使用相同的名称并不是一个好习惯。
同样,您最好的选择是跳过整个练习,但如果您选择继续,那么您需要了解代码中出现的范围内宏标识符将被宏定义替换。因此,预处理的结果是:
#define ACos // suggested modification extern t_float ACos(const t_float X);
将会
extern t_float (const t_float X);
,因为您已定义ACos
扩展为空序列。预处理结果无效。如果您必须遵循此路径,则定义宏以扩展为自己的名称:
#define ACos ACos
然后,您将能够通过#ifdef
指令对其进行测试,但您将避免导致预处理器破坏您的程序。但同样,真的,不要这样做。
推荐阅读
- jenkins - 在执行 Jenkins 的某些步骤(如 when 指令)后,如何跳过 Jenkins 阶段?
- python - 在 Python 3.8 中调试随机坠落物体的编码
- reactjs - 与材质 ui 重叠网格
- clojurescript - 如果错误使用了承诺,则必须重新启动 Cider repl
- node.js - API Gateway 为 requestParameter 键映射多个值
- keras - 多对多序列预测可变长度输入/输出inkeras
- powershell - PS脚本中的硬编码域名
- reactjs - BrowseSEO 无法读取 Next.js React App 中的 META 标签
- javascript - 如何提前缓冲来自在线的视频,如 reat-native 中的 youtube?
- zsh - zinit:integer:7: IFS: 不能改变特殊参数的类型