解决C ++中的复合文字以消除警告

Ste*_*art 5 c++

我正在C ++应用程序中使用libsystemd-dev(一个C库)。

我收到gcc / clang pedantic警告

复合文字是C99特定的功能

使用此代码:

#include <systemd/sd-bus.h>

void foo()
{
  sd_bus_error err = SD_BUS_ERROR_NULL;  // compound literals are a C99-specific feature
  ...
}
Run Code Online (Sandbox Code Playgroud)

查看<systemd/sd-bus.h>头文件,我看到:

typedef struct {
        const char *name;
        const char *message;
        int _need_free;
} sd_bus_error;

#define SD_BUS_ERROR_MAKE_CONST(name, message) ((const sd_bus_error) {(name), (message), 0})
#define SD_BUS_ERROR_NULL SD_BUS_ERROR_MAKE_CONST(NULL, NULL)
Run Code Online (Sandbox Code Playgroud)

这意味着我可以通过以下方式解决警告:

#include <systemd/sd-bus.h>

void foo()
{
  sd_bus_error err = {nullptr, nullptr, 0};
  ...
}
Run Code Online (Sandbox Code Playgroud)

但这是个好主意吗?如果库发生更改,我的代码也需要更改,因此我觉得它是易变的。这个警告真的有什么问题吗?有更好的解决方法吗?

总是有只使用编译器标志来禁用警告的方法,但是我想知道是否可以通过代码内鼓励的方法来解决此问题。

MSa*_*ers 5

无所不包已经暗示了一种方法-在包装函数中使用扩展。更为健壮的方法是extern "C"在其自己的转换单元中使用包装函数。将整个翻译单元编译为C11,不带扩展名。

这通常更健壮。在源代码级别混合代码需要高级编译器支持,而链接C和C ++非常简单。