gpt4 book ai didi

c - Qt Creator ClangCodeModel 无法解析或自动完成条件嵌套包含?

转载 作者:行者123 更新时间:2023-11-30 16:44:02 25 4
gpt4 key购买 nike

我正在使用 QtCreator 启动一个 C 语言嵌入式 AVR 项目。

我相信我已完成所有设置并正常工作;我可以编写来自 avr-libc 的 #include header 的代码,使用自定义 makefile 进行构建,并且二进制文件会自动闪烁到我的芯片上。不幸的是,即使我的代码编译时没有收到 avr-gcc 的任何警告,QtCreator 的 ClangCodeModel 插件也无法识别 #define'd 端口和寄存器名称的子集 - 它声称存在错误,并且自动补全不起作用。

<小时/>

我想我已经发现了问题:

avr 项目中的样板 #include 是 #include <avr/io.h> 。 io.h 本身#include 无条件地包含许多其他 header ,无论是什么,例如定义所有 AVR 设备通用的寄存器名称的 header 。代码完成确实可以与那些 header 中定义的名称正常工作。但是,它还有条件包含一个基于您所针对的特定 AVR 设备的其他 header 。市面上有数百种 AVR 设备,每一种都有自己的头文件,用于定义端口和寄存器名称。 io.h 确定要包含哪一个,如下所示:

#if defined (__AVR_AT94K__)
# include <avr/ioat94k.h>
#elif defined (__AVR_AT43USB320__)
# include <avr/io43u32x.h>
#elif defined (__AVR_AT43USB355__)
# include <avr/io43u35x.h>
#elif defined (__AVR_AT76C711__)
# include <avr/io76c711.h>
.
.
.

等等。我认为实际上必须包含正确的 header ,因为编译不会引发错误,即使 ClangCodeModel 确实显示错误标签。我的意思是,我可以编写引用特定于设备的寄存器名称的代码并毫无问题地进行编译,但 ClangCodeModel 无法识别该寄存器名称。

编辑:请注意,如果我实际上直接 #include <avr/iom328p.h>在 main.c 的顶部,ClangCodeModel 可以很好地解析 header 并且自动完成功能可以正常工作。不幸的是,我实际上不能就这样离开。来自 :

This header file includes the apropriate IO definitions for the device that has been specified by the -mmcu= compiler command-line switch. This is done by diverting to the appropriate file <avr/ioXXXX.h> which should never be included directly. Some register names common to all AVR devices are defined directly within <avr/common.h>, which is included in <avr/io.h>, but most of the details come from the respective include file.

来自 :

/* This file should only be included from <avr/io.h>, never directly. */
<小时/>

来自ClangCodeModel documentation :

The feedback you get through warning and error markers is the same as a compiler will give you, not an incomplete set or a close approximation, as when using the built-in Qt Creator code model.

事实似乎并非如此。对我来说,这个说法意味着 ClangCodeModel 将继续评估 #if defined (__MY_AVR__) ,并解析正确的设备特定 header ,这在这里没有发生。

代码补全工作对我来说至关重要,因为嵌入式项目需要整天输入深奥的寄存器和端口名称宏。

我错过了什么?

<小时/>

makefile ,以及 makefile referenced at the bottom include .

The general <avr/io.h>.

The device-specific header <avr/iom328p.h> which has all the names I need, and ClangCodeModel is failing to parse.

Contents of QtCreator's MyProjectName.includes (I added these lines manually).

最佳答案

您应该添加

#define __AVR_ATmega328__

到您的 MyProjectName.config 文件。QtCreator 的代码模型无法获取所有编译器定义,因为您的 Makefile 不是由 qmake、cmake 或 qbs 生成的。

关于c - Qt Creator ClangCodeModel 无法解析或自动完成条件嵌套包含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44782234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com