gpt4 book ai didi

c++ - 在派生类中初始化基于 C 的 API 提供的基于 C 的 typedef 结构?

转载 作者:太空宇宙 更新时间:2023-11-04 16:08:09 35 4
gpt4 key购买 nike

我有一个 OVERLAPPED 我正试图进入一个已知的良好状态。 OVERLAPPED 是 Win32 API 提供的 Windows typedef 结构。我无法改变它。

#pragma push_macro ("WIN32_LEAN_AND MEAN")
#pragma push_macro ("NOMINMAX")

#define WIN32_LEAN_AND MEAN
#define NOMINMAX
#include <windows.h>

struct OverlappedIo : public OVERLAPPED
{
explicit OverlappedIo()
: Internal(0), InternalHigh(0), Offset(0), OffsetHigh(0)
, Pointer(NULL), hEvent(hEvent) { }

...
};

#pragma pop_macro ("NOMINMAX")
#pragma pop_macro ("WIN32_LEAN_AND MEAN")

在 MinGW 下,它会导致(在 native Win32 下可能会出现问题;我还没有开始测试该平台):

g++ -DNDEBUG -g -O2 -march=native -pipe -c network.cpp
In file included from network.cpp:4:0:
network.h: In constructor 'OverlappedIo::OverlappedIo()':
network.h:244:5: error: class 'OverlappedIo' does not have any field n
amed 'Internal'
: Internal(0), InternalHigh(0), Offset(0), OffsetHigh(0)
^
...

我也试过 _OVERLAPPED结果相同。当我尝试提供缺少的构造函数来执行 C++ 初始化时(我没想到这会起作用,但值得一试):

//! OVERLAPPED I/O
OVERLAPPED::OVERLAPPED()
: Internal(0), InternalHigh(0), Offset(0), OffsetHigh(0), hEvent(NULL) { }

结果是:

In file included from network.cpp:4:0:
network.h:24:24: error: ISO C++ forbids declaration of 'OVERLAPPED' with no type
[-fpermissive]
OVERLAPPED::OVERLAPPED()
^

在 C++11 中,我相信我可以用大括号进行初始化。但我不清楚如何在 C++03 中做到这一点。还要注意这是一个简化的例子,真正的类更复杂,它试图提供更强的异常安全性。因为异常安全性更强,所以我想初始化字段,而不是memset他们或分配给他们。 (对“初始化”和“赋值”的词造假感到抱歉)。

是否可以从 C 中初始化一个 typedef 结构?

如果是这样,我如何在 C++03 中初始化结构的字段?


相关的,这是来自<windows.h>的结构:

typedef struct _OVERLAPPED {
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
union {
struct {
DWORD Offset;
DWORD OffsetHigh;
} DUMMYSTRUCTNAME;
PVOID Pointer;
} DUMMYUNIONNAME;

HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;

这与 Are members of a C++ struct initialized to 0 by default? 有关和 Correct way of initializing a struct in a class constructor .它也与Do the parentheses after the type name make a difference with new?有些相关。 (我试图避免愚蠢的规则,只是将对象置于已知的良好状态)。

最佳答案

我不愿意以这种方式解决问题:如果 OVERLAPPED 以任何方式发生更改,您的代码可能会失效。如果您希望初始化所有 成员,那么将来向 OVERLAPPED 添加的任何成员都可能会在您的程序中引入未定义的行为。

另请注意,OVERLAPPED 可能不是多态类型,因此您可能会在程序开发时容易受到内存泄漏的影响。

考虑使用类的 OVERLAPPED 成员变量,并在构造函数中调用 memset 将结构初始化为零。

关于c++ - 在派生类中初始化基于 C 的 API 提供的基于 C 的 typedef 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31958402/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com