在 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;dr:只需使用引用即可。

如果您的包装器使用 references,您可以完全避免您的问题,并获得您喜欢的方便的调用约定 - 无需实例化任何不必要的结构副本。如果您是 C++ 的新手,可以阅读这个 Whosebug 问题,其中简要介绍了它们:References in 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. 时永远不会使用
  3. 不被 SDL_foo() 修改,尽管它没有被指定为 const SDL_Rect*

你也可以这样写:

inline void my_wrapper_name(const SDL_Rect& rect) {
    SDL_foo(const_cast<SDL_Rect*>(&rect));
}

在这种情况下,您可以在代码的其他地方和实际定义的 SDL_RectSDL_Rect.

的初始化列表调用包装器