如果我想仅在未定义值时定义值,我会执行以下操作:
#ifndef THING
#define THING OTHER_THING
#endif
Run Code Online (Sandbox Code Playgroud)
如果THING是typedef'd标识符,并且未定义,该怎么办?我想做这样的事情:
#ifntypedef thing_type
typedef uint32_t thing_type
#endif
Run Code Online (Sandbox Code Playgroud)
问题出现了,因为我想检查外部库是否已经定义了boolean类型,但我愿意听一个更通用的解决方案.
Dav*_*eas 24
语言中没有这样的东西,也不需要.在单个项目中,您不应该使用相同的typedef别名来引用不同类型,因为这违反了ODR,如果您要为同一类型创建相同的别名,那么就这样做.该语言允许您根据需要多次执行相同的typedef,并且通常会捕获该特定ODR(在同一个翻译单元中):
typedef int myint;
typedef int myint; // OK: myint is still an alias to int
//typedef double myint; // Error: myint already defined as alias to int
Run Code Online (Sandbox Code Playgroud)
如果您打算通过使用typedef来确定使用哪种功能来实现不同类型的功能,那么您应该查看模板而不是typedef.
Alo*_*ave 20
C++没有提供任何代码来测试存在的机制,typedef你可以拥有的最好的东西是这样的:
#ifndef THING_TYPE_DEFINED
#define THING_TYPE_DEFINED
typedef uint32_t thing_type
#endif
Run Code Online (Sandbox Code Playgroud)
编辑:
作为@David,他的评论是正确的,这回答如何?部分,但重要的是错过了原因?它可以通过上面的方式完成,如果你想要做到这一切,但重要的是你可能不需要这样做,@ David的答案和评论解释了细节,我认为这正确地回答了问题.
在预处理阶段,C++中没有这样的工具.在最大可以做到
#ifndef thing_type
#define thing_type uint32_t
#endif
Run Code Online (Sandbox Code Playgroud)
虽然这不是一个好的编码实践,但我不建议.
预处理程序指令(例如#define)是粗略的文本替换工具,它们对编程语言一无所知,因此它们不能对任何语言级别的定义起作用.
确保类型仅定义一次有两种方法:
#define预处理器宏与类型一起使用,并#ifndef在定义类型之前用于检查宏定义.第一个选项通常会导致更易于维护的代码.如果你不小心在一个程序中最终得到了不同的类型定义,第二个可能会导致细微的错误.