如何修复在C++代码中包含linux cn_proc.h标头时无效的转换错误

How to fix invalid conversion error when including linux cn_proc.h header in C++ code

提问人:Cimbali 提问时间:11/6/2023 更新时间:11/6/2023 访问量:40

问:

2023 年 7 月 23 日起,linux 标头包含以下内容:cn_proc.h

#define PROC_EVENT_ALL (PROC_EVENT_FORK | PROC_EVENT_EXEC | PROC_EVENT_UID |  \
            PROC_EVENT_GID | PROC_EVENT_SID | PROC_EVENT_PTRACE | \
            PROC_EVENT_COMM | PROC_EVENT_NONZERO_EXIT |           \
            PROC_EVENT_COREDUMP | PROC_EVENT_EXIT)

/*
 * If you add an entry in proc_cn_event, make sure you add it in
 * PROC_EVENT_ALL above as well.
 */
enum proc_cn_event {
    /* Use successive bits so the enums can be used to record
     * sets of events as well
     */
    PROC_EVENT_NONE = 0x00000000,
    PROC_EVENT_FORK = 0x00000001,
    PROC_EVENT_EXEC = 0x00000002,
    PROC_EVENT_UID  = 0x00000004,
    PROC_EVENT_GID  = 0x00000040,
    PROC_EVENT_SID  = 0x00000080,
    PROC_EVENT_PTRACE = 0x00000100,
    PROC_EVENT_COMM = 0x00000200,
    /* "next" should be 0x00000400 */
    /* "last" is the last process event: exit,
     * while "next to last" is coredumping event
     * before that is report only if process dies
     * with non-zero exit status
     */
    PROC_EVENT_NONZERO_EXIT = 0x20000000,
    PROC_EVENT_COREDUMP = 0x40000000,
    PROC_EVENT_EXIT = 0x80000000
};

/* [some unrelated code removed] */

static inline enum proc_cn_event valid_event(enum proc_cn_event ev_type)
{
    ev_type &= PROC_EVENT_ALL;
    return ev_type;
}

这意味着,如果您在内核 6.5.6 上编译以下最小中断示例:

#include <iostream>

#include <linux/cn_proc.h>

int main()
{
    std::cout << "Hello World\n";
    return 0;
}

编译失败,并出现以下错误:

/usr/include/linux/cn_proc.h: In function ‘proc_cn_event valid_event(proc_cn_event)’:
/usr/include/linux/cn_proc.h:72:17: error: invalid conversion from ‘unsigned int’ to ‘proc_cn_event’ [-fpermissive]
   72 |         ev_type &= PROC_EVENT_ALL;
      |                 ^
      |                 |
      |                 unsigned int

似乎在 C++ 中,值的 -aggregate 被认为是 而不是 ,也不是 ,它似乎是 的基础类型。|enum proc_cn_eventPROC_EVENT_ALLunsigned intenum proc_cn_eventintenum proc_cn_event

(在 g++ 13.1 和 clang++ 17.0 上测试)

请注意:

  • 标头编译为 C 代码
  • 将 include 语句包装起来并不能解决此问题extern "C" { … }
  • 在包含前面添加正向声明以强制基础类型失败,并显示:enum proc_cn_event : unsigned int;unsigned int
    /usr/include/linux/cn_proc.h:42:6: error: enumeration previously declared with fixed underlying type
        42 | enum proc_cn_event {
           |      ^
    test.cpp:3:6: note: previous declaration is here
         3 | enum proc_cn_event : unsigned int;
           |      ^
    

我不确定我是否做错了,并且有一种正确的方法可以将该标头包含在 C++ 代码中,或者我是否不应该尝试将其包含在 C++ 代码中(似乎有点激烈)。

那么我怎样才能在不使用 的情况下进行编译呢?我可以在我的 C++ 代码中添加一些东西来编译它(也许是隐式转换为值的东西?-fpermissiveunsigned intenum proc_cn_event

C++ Linux 枚举 linux-kernel-headers

评论

0赞 Toby Speight 11/6/2023
我认为您需要禁用包含的诊断 - 也许在它周围使用/对。#pragma gcc diag pushpop
1赞 Toby Speight 11/7/2023
我猜未签名的原因是超出了这个平台的范围。PROC_EVENT_ALLPROC_EVENT_EXIT = 0x80000000signed int
1赞 Toby Speight 11/7/2023
你能用 C 为需要这个标头的部分编写包装器,然后从 C++ 代码中使用这些 C 函数吗?
0赞 n. m. could be an AI 11/7/2023
嗯,这是一个 C 头。使用 C++ 编译器编译它的风险由您自行承担。解决问题的正确方法是提交 PR 以使代码与 C++ 兼容。

答: 暂无答案