在C++我可以在不在本地声明结构的情况下将结构作为指针传递吗?

In C++ can I pass a structure as a pointer without declaring it locally?

本文关键字:结构 指针 我可以 C++ 声明 情况下      更新时间:2023-10-16

我正在使用 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将:

  1. 除调用SDL_foo()
  2. 即使未被指定为采取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的初始值设定项列表中调用包装器。