相关疑难解决方法(0)

typedef有什么用?

在C中使用typedef关键字有什么用?什么时候需要?

c typedef

54
推荐指数
4
解决办法
9万
查看次数

typedef的头文件最佳实践

我在一个项目中广泛使用了shared_ptr和STL,这导致了过长的,容易出错的类型shared_ptr< vector< shared_ptr<const Foo> > >(我喜欢ObjC程序员,长名称是常态,但这仍然太过分了.)我相信,更加清楚的是,一致地调用它FooListPtr并记录命名约定,"Ptr"表示shared_ptr,"List"表示shared_ptr的向量.

这很容易输入typedef,但它会导致头文件出现问题.我似乎有几个选项可以定义FooListPtr:

  • Foo.h. 这会缠绕所有标题并造成严重的构建问题,因此它不是首发.
  • FooFwd.h("前向标题").这就是Effective C++建议的,基于iosfwd.h.它非常一致,但保持两倍标题的开销似乎很烦人.
  • Common.h(将所有这些放在一个文件中).这通过缠绕许多不相关的类型来杀死可重用性.您现在不能只拿起一个对象并将其移动到另一个项目.这不是首发.
  • 某种类似幻想的#define魔法,如果它还没有被typedefed,那就是typedef.我对预处理器持续不喜欢,因为我认为它让新人很难理解代码,但也许......
  • 使用向量子类而不是typedef.这似乎很危险......

这里有最好的做法吗?当可重用性,可读性和一致性至关重要时,它们如何在实际代码中生效?

如果其他人想要添加其他选项供讨论,我已经标记了这个社区维基.

c++ typedef

51
推荐指数
2
解决办法
3万
查看次数

在C++中正确使用typedef

我有同事偶尔使用typedef来避免打字.例如:

typedef std::list<Foobar> FoobarList;
...
FoobarList GetFoobars();
Run Code Online (Sandbox Code Playgroud)

就个人而言,我总是讨厌遇到这样的代码,很大程度上是因为它迫使我去查找typedef所以我可以告诉如何使用它.我也觉得这种事情是一个潜在的滑坡...如果你这样做,为什么你不这样做呢?(很快,你的代码完全被混淆了).我在这个问题上发现了这个问题:

什么时候应该在C中使用typedef

我有两个问题:1)我真的一个人不喜欢这个吗?2)如果绝大多数人认为这种typedef使用正常,你用什么标准来确定是否键入一个类型?

c++ typedef

13
推荐指数
4
解决办法
5171
查看次数

有效使用typedef?

我有一个char(即字节)缓冲区,我通过网络发送.在将来的某个时候,我可能想要将缓冲区切换为不同的类型,如unsigned charshort.我一直在考虑做这样的事情:

typedef char bufferElementType;
Run Code Online (Sandbox Code Playgroud)

每当我用缓冲元素做任何事情时,我都会声明它bufferElementType而不是char.这样我可以通过改变这个typedef切换到另一种类型(当然它不会那么简单,但它至少很容易识别需要修改的地方...... bufferElementType附近会有一个).

这是typedef的有效/好用吗?难道不值得吗?这会在将来的某个时候让我头疼吗?会不会让维护程序员讨厌我?

我已经阅读了何时应该在C++中使用Typedef,但没有人真正涵盖这一点.

c++ typedef

5
推荐指数
1
解决办法
758
查看次数

为什么我应该在C++中使用typedef声明枚举?

我的代码看起来像这样:

enum EEventID {
  eEvent1,
  eEvent2,
  ...
  eEventN };
Run Code Online (Sandbox Code Playgroud)

这被审查并改为

typedef enum {
  eEvent1,
  eEvent2,
  ...
  eEventN } EEventID;
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?为什么要做出改变?当我看到这个问题时,唯一提到的typedef被低估了.

c++ enums typedef

5
推荐指数
1
解决办法
259
查看次数

Typedef和cast

typedef似乎是C++特定的(可能在其他一些语言中).我发现它隐藏了该值的真实数据类型,因此令项目新手感到困惑.也许有时缩短打字很有用.你什么时候推荐使用typedef

我还注意到我不能将typedef-ed值传递给接受底层类型的函数?

就像是:

typedef string VAL;
VAL s = "x";
func(string x); // if I try to pass `s`, I get something like no instance of function template match argument list
Run Code Online (Sandbox Code Playgroud)

c++ casting typedef

5
推荐指数
1
解决办法
6368
查看次数

我需要帮助理解如何在 vb.net 中使用 C++ typedef

我有两个问题;我相信第一个更容易的问题必须在第二个之前解决,所以我在这里只坚持那个。

首先,概述:我有一个使用 USB 端口的硬件设备,并且有一个自定义 DLL 可以与它​​通信。我正在使用 VB.net 从 C++ 升级。自定义 DLL 有许多函数,我已经能够为除一个之外的所有函数进行编程,使用 IntPtr 和 Marshalling 函数进行更简单的 DLL 调用;最后一个,这将是我的第二个问题/帖子,给我带来了问题。它是一种回调类型操作,并使用 TYPEDEF 定义。

所以,第一个问题:我如何转换

typedef void (WINAPI *MyFunctPtr)(unsigned char*,int, LPVOID)
Run Code Online (Sandbox Code Playgroud)

进入VB.net?我理解(我认为)这是定义一个名为 MyFunctPtr 的指针,它接受三个参数,并且是 VOID 的别名,这意味着它不会返回任何内容。这是正确的,我如何在 VB.net 中使用它?

typedef 的用法如下:

AddHandler(MyPtrType func,  LPVOID pParam);
Run Code Online (Sandbox Code Playgroud)

其中 AddHandler 是 DLL 调用(这将是我的第二个问题/帖子的主题,以及所需的 DECLARE 语句)。

为了追求这个主题,我查看了许多论坛和问答式讨论,但似乎没有一个专门解决这个问题(至少,我的无知不能说)。我确实在这个论坛中发现了一个与同一问题非常接近的主题(“在 .NET 中使用 C 回调函数”),但我知道的不够多;我什至不明白答案,更别提问题了!

正如我所指出的,这个问题还有第二部分:

1.此代码旨在通过 USB 与外部硬件设备进行通信。我成功地使用了许多其他函数,使用 DLL 调用和带 INTPTR 的封送处理。

2.但是这段代码需要的功能有些不同。从本质上讲,涉及四个方面的努力:

a) 通过执行 DLL 调用来响应“GoButton”点击,该调用将 CallBack 函数注册到外部设备(这是一个 DLL 调用,当然,传递对 CallBack 函数的引用。这会告诉外部硬件向何处发送它是发生适当事件时的数据)并产生第二个线程。

b) 作为新产生的第二个线程,通过执行 DLL 调用来响应,该调用实际上告诉外部硬件“OK,开始响应事件,并将数据发送到 CallBack”

c) 在第一个/原始线程中,通过执行 …

c++ vb.net

5
推荐指数
1
解决办法
1030
查看次数

我应该避免使用typedef,尝试使用原始名称并在可能的情况下进行转换吗?

我不确定这里的词汇,但希望我能让自己明白.

当我正在使用一个不那么坚如磐石的C++知识来完成winapi时,我发现很多typedef的东西,对我来说,似乎使问题过于复杂,并添加了一件我必须记住的事情.

例如,UINT而不是unsigned int,HBITMAP结果只是一个HANDLE,而很多其他.

我的问题是,是否可以/应该在可能的情况下替换该类型的更通用版本,并在需要时将其删除(以及这称为什么)?

例如,我想写

  • void SomeFunction(unsigned int some_int) { ... } 代替 void SomeFunction(UINT some_int) { ... }

  • HANDLE hBMP = LoadImage(...); ImageList_Add(... (HBITMAP) hBMP ...); 代替 HBITMAP hBMP = ...

这对新手来说是好事,一般来说是不好的做法,还是什么?

c++ winapi types casting typedef

3
推荐指数
2
解决办法
734
查看次数

标签 统计

c++ ×7

typedef ×7

casting ×2

c ×1

enums ×1

types ×1

vb.net ×1

winapi ×1