我在一个项目中广泛使用了shared_ptr和STL,这导致了过长的,容易出错的类型shared_ptr< vector< shared_ptr<const Foo> > >(我喜欢ObjC程序员,长名称是常态,但这仍然太过分了.)我相信,更加清楚的是,一致地调用它FooListPtr并记录命名约定,"Ptr"表示shared_ptr,"List"表示shared_ptr的向量.
这很容易输入typedef,但它会导致头文件出现问题.我似乎有几个选项可以定义FooListPtr:
这里有最好的做法吗?当可重用性,可读性和一致性至关重要时,它们如何在实际代码中生效?
如果其他人想要添加其他选项供讨论,我已经标记了这个社区维基.
我有同事偶尔使用typedef来避免打字.例如:
typedef std::list<Foobar> FoobarList;
...
FoobarList GetFoobars();
Run Code Online (Sandbox Code Playgroud)
就个人而言,我总是讨厌遇到这样的代码,很大程度上是因为它迫使我去查找typedef所以我可以告诉如何使用它.我也觉得这种事情是一个潜在的滑坡...如果你这样做,为什么你不这样做呢?(很快,你的代码完全被混淆了).我在这个问题上发现了这个问题:
我有两个问题:1)我真的一个人不喜欢这个吗?2)如果绝大多数人认为这种typedef使用正常,你用什么标准来确定是否键入一个类型?
我有一个char(即字节)缓冲区,我通过网络发送.在将来的某个时候,我可能想要将缓冲区切换为不同的类型,如unsigned char或short.我一直在考虑做这样的事情:
typedef char bufferElementType;
Run Code Online (Sandbox Code Playgroud)
每当我用缓冲元素做任何事情时,我都会声明它bufferElementType而不是char.这样我可以通过改变这个typedef切换到另一种类型(当然它不会那么简单,但它至少很容易识别需要修改的地方...... bufferElementType附近会有一个).
这是typedef的有效/好用吗?难道不值得吗?这会在将来的某个时候让我头疼吗?会不会让维护程序员讨厌我?
我已经阅读了何时应该在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被低估了.
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) 我有两个问题;我相信第一个更容易的问题必须在第二个之前解决,所以我在这里只坚持那个。
首先,概述:我有一个使用 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++知识来完成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 = ...
这对新手来说是好事,一般来说是不好的做法,还是什么?