在C++我可以在不在本地声明结构的情况下将结构作为指针传递吗?
In C++ can I pass a structure as a pointer without declaring it locally?
我正在使用 SDL,它是一个 C 库,具有如下函数声明:
void SDL_foo(SDL_Rect *rect);
我有自己的包装器,围绕一些函数,如下所示:
void foo(SDL_Rect rect) {
SDL_foo(&rect);
}
这样我就可以简单地这样称呼它们:
foo({x, y, w, h});
我的问题是:是否有可能避免使用包装器函数并执行以下操作:
SDL_foo(&{x, y, w, h});
谢谢!
不,你不能这样做,因为你无法获得临时的地址。
但是您可能可以使用这样的包装器来侥幸逃脱:
struct MyRect {
MyRect(SDL_rect rect): rect{rect} {}
operator SDL_rect *() { return ▭ }
SDL_rect rect;
};
SDL_foo(MyRect{{x, y, w, h}});
尚未测试,但它应该让您了解我的意思。
这样,您不必为 SDL 中的所有函数创建包装器,而只需在SDL_rect
周围创建一个很小的包装器。
不确定它是否适合您。
tl;大卫:只使用参考文献。
如果您的包装器使用引用,您可以完全避免您的问题,并获得您喜欢的方便调用约定 - 无需实例化任何不必要的结构副本。如果你不熟悉C++,你可以阅读这个StackOverflow问题,它简要介绍了它们:C++中的参考文献。
无论如何,如果您要包装的 SDL 函数具有签名:
void SDL_foo(SDL_Rect *rect);
那么你的包装器将是:
inline void my_wrapper_name(SDL_Rect& rect) {
SDL_foo(&rect);
}
即使SDL_Rect
只是向前声明,这也有效!
现在,如果您确定SDL_Rect
将:
- 除调用
SDL_foo()
和 - 即使未被指定为采取
const SDL_Rect*
,但不会被SDL_foo()
修改
你也可以写:
inline void my_wrapper_name(const SDL_Rect& rect) {
SDL_foo(const_cast<SDL_Rect*>(&rect));
}
在这种情况下,您将能够在代码中 elswhere 中并在实际定义SDL_Rect
的情况下,在SDL_Rect
的初始值设定项列表中调用包装器。
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- C++:映射结构中的结构指针
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 类的静态结构指针声明在C++
- 在两个.cpp文件之间定义全局类/结构指针
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 是否可以将无符号字符数组reinterpret_cast到仅包含C++中无符号字符成员的结构指针
- 如何在地图中使用结构指针
- 结构指针在"新"调用上给出已分配的地址?
- 铸造结构指针指向C 的工会指针
- c++ 结构指针在初始化为 NULL 时无法读取内存
- 函数中的结构指针的地址为0x1
- C 用结构指针初始化结构
- C 结构指针铸成数组Interop C#
- 方法中不允许访问结构指针
- 如何打印出结构指针
- MPI_Op_create:候选功能不可行.自定义结构指针不能解释为空指针
- 尝试将结构指针传递给类时出错
- 初始化结构指针的值
- 使用 pybind11 将自定义结构(指针向量)从 C++ 传递到 python 的方法是什么?