c++ - 绕过 C++ 中的复合文字以删除警告

标签 c++

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

我收到 gcc/clang 迂腐的警告

compound literals are a C99-specific feature

使用此代码:

#include <systemd/sd-bus.h>

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

查看 <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)

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

#include <systemd/sd-bus.h>

void foo()
{
  sd_bus_error err = {nullptr, nullptr, 0};
  ...
}

但这是个好主意吗?如果库发生变化,我的代码也需要改变,所以我觉得它是不稳定的。这个警告真的有问题吗?有没有更好的方法来解决这个问题?

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

最佳答案

Omnifarious 已经暗示了一种方法——在包装函数中使用扩展。稍微更稳健的方法是在其自己的翻译单元中使用 extern "C" 包装函数。将整个翻译单元编译为 C11,没有扩展。

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

关于c++ - 绕过 C++ 中的复合文字以删除警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56626480/

相关文章:

c++ - 使用 type_traits 来限制模板成员函数的类型

c++ - 确保 std::bind 提供正确数量的参数

c++ - 在应用程序版本中使用 svn 修订号

c++ - CMake 需要管理员

Python C,待定,从多个线程调用一个函数

c++ - 获取目录中最早的文件

c++ - 如何在 C++ 中通过链接器进行模拟测试

C++ 使用类作为变量

c++ - 链接列表队列号移动

c++ - 删除双向链表中的项目