繁体   English   中英

如何在 c (arduino) 中使用#define 正确硬编码编译器的定义标志 (-D)

[英]How to properly hardcode compiler's define flag (-D) with #define in c (arduino)

将编译器的 -D 标志硬编码到源文件中的最佳方法是什么?

我想将#define 放在其中一个标题中,然后导入一堆应该对该定义做出反应的东西。 它是这样工作的吗? 我应该放哪个header? 还是直接到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 用于驱动项目的任何内容中,因为这样可以确保每个人都能看到它。

因此,如果您确实有多个源文件并且您不能或不会将其放入项目文件中,那么处理它的方法是使用您自己的自定义 header 仅用于此目的:

// my_spi_stuff.h
#define USE_SOFTWARE_SPI 
#include <spi_stuff.h>
... others if needed

然后将其包含在您的.c程序中。 确保给文件起一个强烈暗示“局部调整”的名称,而不是可能与库提供的名称混淆的名称。

编辑我刚刚重新读到这是 Arduino,据我所知 IDE 没有项目范围的设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM