Visual studio code 为什么VSCode';s Intellisense无法解析#如果已定义(u GNUC_u)?
我使用Atom、CLion进行内核模块开发,我想尝试一下VSCode Intellisense找不到某些类型和宏,例如所有的Visual studio code 为什么VSCode';s Intellisense无法解析#如果已定义(u GNUC_u)?,visual-studio-code,intellisense,kernel-module,Visual Studio Code,Intellisense,Kernel Module,我使用Atom、CLion进行内核模块开发,我想尝试一下VSCode Intellisense找不到某些类型和宏,例如所有的uint*\u t,u*,dev\u t,DECLARE\u BITMAP() 在快速查看类型.h之后,似乎所有这些类型/宏都是在之后定义的(如果已定义(u GNUC_u)) 这是一个已知的问题吗 如何解决这个问题?内核头中充满了那些#if defined() 这是我的c_cpp_属性。json: { “配置”:[ { “定义”:[ “uuu GNUC_uuuuu”,
uint*\u t
,u*
,dev\u t
,DECLARE\u BITMAP()
在快速查看
类型.h
之后,似乎所有这些类型/宏都是在之后定义的(如果已定义(u GNUC_u)
)
- 这是一个已知的问题吗
- 如何解决这个问题?内核头中充满了那些
#if defined()
{
“配置”:[
{
“定义”:[
“uuu GNUC_uuuuu”,
“\uuuu内核\uuuuu”,
“_GNU_SOURCE”,
“模块”,
],
“名称”:“Linux”,
“包含路径”:[
“${workspaceFolder}/**”,
“/usr/src/kernels/3.10.0-1127.8.2.el7.x86_64/include/**”,
“/usr/src/kernels/3.10.0-1127.8.2.el7.x86_64/arch/x86/include/**”
],
“编译器路径”:“/opt/rh/devtoolset-7/root/usr/bin/gcc”,
“cStandard”:“gnu11”,
“cppStandard”:“gnu++14”,
“intelliSenseMode”:“gcc-x64”
}
],
“版本”:4
}
Linux内核有许多头文件,它们的名称相同,但位于不同的目录中。这些文件的确切路径确实很重要
出于这个原因,最好不要“glob”(使用终止的/**
)包含Linux内核的目录,而是编写精确的目录:
"includePath": [
# You could glob include directories for your module
"${workspaceFolder}/**",
# .. but do not glob Linux kernel ones
"/usr/src/kernels/3.10.0-1127.8.2.el7.x86_64/include",
# Do not glob arch-specific include directories for Linux kernel too
"/usr/src/kernels/3.10.0-1127.8.2.el7.x86_64/arch/x86/include"
],
“在快速查看
类型.h
之后,似乎所有这些类型/宏都是在之后定义的,如果定义了(\uu GNUC\uuuuu)
”——在我只看到loff\u t
中,并且64位类型是在下定义的,其他类型和声明位图
不需要此宏。我建议删除“/usr/src/kernels/3.10.0-1127.8.2.el7.x86_64/include/**”中的最后一行(**
),下面一行:Linux内核有许多同名的头文件,这些文件的确切路径非常重要。这解决了问题,谢谢!我不知道子文件夹中的某些文件可以覆盖默认文件。这是否回答了您的问题?不完全,但它可以帮助一天,感谢链接!能否添加原因或链接,解释为什么include
文件夹包含同名的不同文件?这看起来是一个非常笨拙的架构选择头文件名称重复的一个原因是用户空间库/应用程序中某些Linux头文件的可用性。虽然这些文件被分组到uapi/
子目录中,但它们需要纯内核头中包含的一些定义(类型、宏)。因此,Linux内核包含两个不同的头:一个用于内核内使用,另一个用于用户空间安装。特别是对于types.h
头,它的使用更加灵活。我甚至无法描述这种灵活性。