Tag: typedef

为什么C ++中的types别名在其语法中使用“using”而不是“typedef”?

显然,input别名和模板types别名在语义上等同于typedefs和typedefs的扩展以支持模板。 如何using关键字创build新的语法,而不是使用typedef作为typedef的第一个和一些语法扩展。 注意:这不是“使用和typedef之间的区别”问题的克隆。 我知道using定义了一个typedef的家庭的优势。 我所问的是为什么标准人员决定让这个扩展名使用using关键字而不是typedef关键字。 这似乎只是增加了语言的混乱。

模板化的typedef?

我正在使用libgc,C和C ++的垃圾收集器。 要使STL容器垃圾收集,必须使用gc_allocator。 而不是写作 std::vector<MyType> 一个必须写 std::vector<MyType,gc_allocator<MyType> > 有没有办法来定义类似的东西? template<class T> typedef std::vector<T,gc_allocator<T> > gc_vector<T>; 我前一阵子检查,发现这是不可能的。 但是我可能错了,或者可能有其他的方法。 用这种方式定义地图特别令人不快。 std::map<Key,Val> 变 std::map<Key,Val, std::less<Key>, gc_allocator< std::pair<const Key, Val> > > 编辑:在尝试使用macros后,我发现下面的代码打破了它: #define gc_vector(T) std::vector<T, gc_allocator<T> > typedef gc_vector( std::pair< int, float > ) MyVector; 模板types定义中的逗号被解释为macros参数分隔符。 所以看起来,内部类/结构是最好的解决scheme。 这里是一个关于如何在C ++ 0X中完成的例子 // standard vector using my allocator template<class T> […]

未命名结构的前向声明

赏金问题:所以,这两个Foo不是一回事。 精细。 第二种forms是在图书馆给出的。 鉴于我无法改变它,我该如何向前申报呢? 我一直认为C和C ++允许重复声明,只要没有重复的定义。 然后,当我试图编写扩展C库的C ++代码时遇到了这个问题。 struct Foo; typedef struct {} Foo; 这给出了以下错误: '结构Foo'有一个前面的声明'结构Foo' 我想向前宣布,补充! 这里有什么问题?

不透明的C结构:他们应该如何申报?

我已经看到了以下两种在C API中声明不透明types的风格。 使用另一种风格有没有明显的优势? 选项1 // foo.h typedef struct foo * fooRef; void doStuff(fooRef f); // foo.c struct foo { int x; int y; }; 选项2 // foo.h typedef struct _foo foo; void doStuff(foo *f); // foo.c struct _foo { int x; int y; };

有没有什么情况下,typedef是绝对必要的?

考虑以下安全布尔成语的摘录: typedef void (Testable::*bool_type)() const; operator bool_type() const; 是否可以声明转换函数没有typedef? 以下不编译: operator (void (Testable::*)() const)() const;

typedef-ing块如何工作

在C / Obj-C中,我们做这样的typedef int MYINT; 这很清楚。 为block执行typedef – typedef void (^MyBlock) (int a); 现在,我们可以使用MyBlock 。 不应该像 – typedef void (^MyBlock) (int a) MyBlock; 类似于#define ? 语法是如何工作的?

枚举值:NSInteger或int?

tl; dr版本 当枚举常量的数据types如此声明一个枚举时,如何保证是NSUInteger而不是unsigned int: enum { NSNullCellType = 0, NSTextCellType = 1, NSImageCellType = 2 }; typedef NSUInteger NSCellType; NSUInteger的typedef似乎没有以任何方式绑定到枚举声明。 完整版 我正在通过苹果的64位cocoa过渡指南阅读一些枚举值的指导,我拿出一个问题。 下面是枚举常量部分(冗长)的引用,重点是我的: 枚举(enum)常量的一个问题是它们的数据types经常是不确定的。 换句话说,枚举常量不是可预测的unsigned int。 使用传统构造的枚举,编译器实际上根据它find的内容设置基础types。 基础types可以是(signed)int或甚至long。 以下面的例子: type enum { MyFlagError = -1, MyFlagLow = 0, MyFlagMiddle = 1, MyFlagHigh = 2 } MyFlagType; 编译器查看这个声明,并find一个赋值给一个成员常量的负值,声明枚举int的基本types。 如果成员的值的范围不适合int或unsigned int,那么基types默默地变成64位(长)。 定义为枚举的数量的基types因此可以静默地改变大小以符合枚举中的值。 无论您是在编译32位还是64位,都可能发生这种情况。 不用说,这种情况给二进制兼容性带来了障碍。 为了解决这个问题,苹果决定在Cocoa API中更加明确枚举types。 现在头文件不是按照枚举来声明参数,而是单独声明枚举的types,这个枚举的大小可以被指定。 […]

理解混淆typedef语法

考虑下面的代码片段 typedef int type; int main() { type *type; // why is it allowed? type *k ;// which type? } 我得到一个错误'k' is not declared in this scope 。 编译器将type *kparsing为type*和k之间的乘法。 这个语法不是很混乱吗? 为什么是C ++标准允许的type *type ? 因为语法是这样说的? 为什么?

重复typedefs – 在C无效,但在C ++有效?

我想要一个标准的引用,为什么下面的代码在C语言中触发了一个符合性警告(使用gcc -pedantic ;“typedef gcc -pedantic ”进行testing),但在C ++( g++ -pedantic )中罚款: typedef struct Foo Foo; typedef struct Foo Foo; int main() { return 0; } 为什么我不能在C中重复定义typedef ? (这对C项目的头结构具有实际意义。)

如果我在C或C ++中执行`typedef`,什么时候应该在typedeftypes的末尾添加`_t`?

我很困惑什么时候应该添加尾随的_t到typedeftypes? 例如,我应该这样做: typedef struct image image_t; 或这个: typedef struct image image; 一般规则是什么? 另一个例子,我应该这样做: typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t; 或这个: typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type; 请赐教。 谢谢,Boda Cydo。