如何解决如果在 C++ 中定义了类型,是否可以在预处理器时检测到?
看起来在 GCC 历史的某些时候,类型 ulong
被定义为 unsigned long long
,但这在编译器之间造成了一些冲突,因为我将项目传递给其他编译器没有的项目ulong
已定义(如 Visual C++)。这是我想做的一个例子:
#ifndef ulong
typedef unsigned long long ulong;
#endif
但这永远不会奏效,因为这不是 #ifdef
的工作方式。你会怎么做?如何以最短的方式做到这一点?
解决方法
对于您的问题,您可以只编写 typedef unsigned long ulong;
而不进行任何预处理,因为您可以重复 typedef(在任何 C++ 中,但如果您使用 C,则只能是 C11 以后)。
我建议根本不要在您的代码中使用 ulong
,因为它只是为了与某些系统兼容而提供的,而不是标准的 C 或 C++。 unsigned long
更容易理解,写起来也不难
作为参考,它在 <sys/types.h>
中定义(作为 unsigned long
而不是 unsigned long long
,但它们可以是相同的大小)
不,预处理器无法确定是否定义了类型(或除预处理器宏以外的任何其他内容)。毕竟,预处理器会在任何事情发生之前运行。
如果您希望代码可以跨计算机移植,请不要使用不属于 C++ 标准的特定于编译器的工具。
,与其检查类型,不如检查编译器。
#ifdef _MSC_VER
typedef unsigned long long ulong;
#endif
或 #if _MSC_VER >= 1910
用于检查最低版本。
其他编译器通常有自己的特定定义,或者只是根据编译器类型提供自己的定义。
,嗯,看到了:
- Visual C++ 没有定义
ulong
- GCC 从 GCC 6 开始定义它
- 最后一个适用于 Clang
- Clang 将
__GNUC__
定义为 Clang 6 中的 4
最好的方法是添加此代码:
#if _MSC_VER || (__GNUC__ && __GNUC__ < 6 && !__clang__) || (__clang__ && __clang_major__ < 6)
typedef unsigned long long ulong;
#endif
并且在大多数情况下都可以工作,但是,如果有人将 GCC 4 与 GCC 6+ 库或类似的东西一起使用,这仍然可能会失败。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。