c - 如何在c(arduino)中使用#define正确硬编码编译器的定义标志(-D)
问题描述
将编译器的 -D 标志硬编码到源文件中的最佳方法是什么?
我想将#define 放在其中一个标题中,然后导入一堆应该对该定义做出反应的东西。它是这样工作的吗?我应该放哪个标题?还是直接到main.c?还是对他们所有人?
TMI 详细信息:这里的环境是 digispark hw-018(带有内置 USB 编程器的 attiny85),#define 应该替换 -DUSE_SOFTWARE_SPI,这样我就可以在 SPI 模式下使用 AVR-CAN 库从 MCP2515 读取内容。
编辑:经过一些恼人的撞墙后,main.c 的顶部现在看起来像这样,但它仍然无法正常工作。
#define USE_SOFTWARE_SPI
#include "src/can.h"
#define USE_SOFTWARE_SPI
#include <avr/io.h>
#define USE_SOFTWARE_SPI
#include <avr/pgmspace.h>
#define USE_SOFTWARE_SPI
#include <DigiUSB.h>
我说得对,有些东西在某处覆盖了我的定义?如果我在#ifndef(或#ifdef)之前硬编码#define USE_SOFTWARE_SPI,它就可以工作
解决方案
这里有几种方法。
如果它只是一个main.c
源文件,那么把它放在文件的顶部就可以了:
// main.c
#define USE_SOFTWARE_SPI // must be first!
#include <spi_stuff.h>
...
如果这需要在多个源文件中,这不能很好地扩展,因为在几个地方之一很容易错过它。
我想即使有多个源文件,但实际上只有一个引用了需要影响的头文件,风险也较小,但这就是错误发生的方式。
我的偏好是将这种东西作为一个整体放在项目定义中,或者makefile
放在 IDE 用来驱动项目的任何东西中,因为这样可以确保每个人都能看到它。
因此,如果您确实有多个源文件并且您不能或不会将其放入项目文件中,那么处理它的方法是使用您自己的自定义标头,该标头仅用于此目的:
// my_spi_stuff.h
#define USE_SOFTWARE_SPI
#include <spi_stuff.h>
... others if needed
然后将其包含在您的.c
程序中。确保给文件起一个强烈暗示“局部调整”的名称,而不是可能与库提供的名称混淆的名称。
编辑我刚刚重新读到这是 Arduino,据我所知,IDE 没有项目范围的设置。
推荐阅读
- laravel - Laravel 未在 Windows 上连接到 Docker/docker-compose 上的数据库
- python - 在 Sklearn 管道中使用 ColumnTransformer() 时出现 ValueError - 为 GloveVectorizer 使用自定义的 Spacy 类
- javascript - 如何使用 HTML、CSS 和 JavaScript 创建一个框来选择大小,如下面的链接所示?
- javascript - 如何使用 Node js 操作 DOM?
- reactjs - 如何解决 react-video-js-player 无法加载媒体的问题
- html - 如何在 CSS 中灰色和模糊的标题下方添加阴影?
- python - 布尔表达式( 0 或 None 和 False)
- ruby-on-rails - 如何在控制器的 sorcery.rb 中获取变量
- dataset - Wild Dataset 中的 SynthText 有多少个字符数?
- reactjs - 在反应中,当更新深层组件的状态时,反应将区分根树还是仅区分深层组件树?