提问人:Cimbali 提问时间:11/6/2023 更新时间:11/6/2023 访问量:40
如何修复在C++代码中包含linux cn_proc.h标头时无效的转换错误
How to fix invalid conversion error when including linux cn_proc.h header in C++ code
问:
自 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_event
PROC_EVENT_ALL
unsigned int
enum proc_cn_event
int
enum 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++ 代码中添加一些东西来编译它(也许是隐式转换为值的东西?-fpermissive
unsigned int
enum proc_cn_event
答: 暂无答案
评论
#pragma gcc diag push
pop
PROC_EVENT_ALL
PROC_EVENT_EXIT = 0x80000000
signed int