结构包含在两个头文件中,这两个文件我都不拥有

Struct included in two header files, neither of which I own

本文关键字:两个 文件 拥有 包含 结构      更新时间:2023-10-16

我正在尝试在 c++ 中玩SCHED_DEADLINE,我需要将struct sched_attr发送到并ioctl,所以我包含了<linux/sched/types.h>,该标头也恰好包含strut sched_param。我还包括了<string>,其中包括 c++ 的标准标头,最终包括includebitssched.h也定义了struct sched_param。编译器(显然(不是特别喜欢这样。我在代码中使用了标头保护(_BITS_TYPES_STRUCT_SCHED_PARAM(来使编译器不包含includebitssched.h,但感觉应该有一个"更好"的方法。

> Executing task in folder sched_deadline_testing: arm-linux-gnueabihf-g++ -o LSM9DS0 src/LSM9DS0.cpp -Wall --pedantic <
In file included from src/LSM9DS0.cpp:36:
/usr/arm-linux-gnueabihf/include/linux/sched/types.h:7:8: error: redefinition of ‘struct sched_param’
struct sched_param {
^~~~~~~~~~~
In file included from /usr/arm-linux-gnueabihf/include/bits/sched.h:74,
from /usr/arm-linux-gnueabihf/include/sched.h:43,
from /usr/arm-linux-gnueabihf/include/pthread.h:23,
from /usr/arm-linux-gnueabihf/include/c++/8/arm-linux-gnueabihf/bits/gthr-default.h:35,
from /usr/arm-linux-gnueabihf/include/c++/8/arm-linux-gnueabihf/bits/gthr.h:148,
from /usr/arm-linux-gnueabihf/include/c++/8/ext/atomicity.h:35,
from /usr/arm-linux-gnueabihf/include/c++/8/bits/basic_string.h:39,
from /usr/arm-linux-gnueabihf/include/c++/8/string:52,
from src/LSM9DS0.cpp:20:
/usr/arm-linux-gnueabihf/include/bits/types/struct_sched_param.h:23:8: note: previous definition of ‘struct sched_param’
struct sched_param

如果这很重要,代码就在这里。我也尝试过这种交叉编译,并在本地编译,都会导致问题。

你运气不好。这两个标头不兼容。您必须避免将<linux/sched/types.h><string>都包含在同一个翻译单元中。可能值得注意的是,作为Linux内核头文件,前者可能不打算在C++中使用,也没有尝试使其兼容。