【问题标题】:How to properly hardcode compiler's define flag (-D) with #define in c (arduino)如何在c(arduino)中使用#define正确硬编码编译器的定义标志(-D)
【发布时间】:2020-11-25 15:49:01
【问题描述】:

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

我想将#define 放在一个 的标题中,然后导入一堆应该对该定义做出反应的东西。它是这样工作的吗?我应该放哪个标题?还是直接到main.c?还是对他们所有人?

TMI-details:这里的环境是 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源文件的最顶部,紧跟在#includes之后呢?这将使所有读者都清楚发生了什么。
  • 请参阅下面 Steve Friedl 的出色回复(如果您觉得有帮助,请“点赞”和“接受”)在项目级别配置 #define(例如“makefile”或 .csproj)是“理想的”。一个单独的 .h 文件 - 其中 #includes ALL 使用该 #define 的标头 - 是一个合理的替代方案。将您的#define 放在 .c 的顶部是最简单的。如果这是一个“一次性”项目,如果您只有一个源文件,并且它适用于您 - 去吧:)
  • Arduino 与任何其他平台没有什么不同。学习正确的方法并应用它。关于如何正确做头文件的教程数不胜数。
  • 由于某种原因,我无法让它工作......将定义放在 main.c 中不起作用。我必须把它放在#ifndef 或#ifdef 所在的同一个文件中......我认为有人已经将它硬编码在某个很深的地方......
  • 请不要在问题中编辑解决方案。请自己创建一个答案或接受现有答案之一。

标签: c arduino compilation header-files pre-compilation


【解决方案1】:

这里有几种方法。

如果它只是一个 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 没有项目范围的设置。

【讨论】:

  • 我在传递#define 时遇到问题...我在编辑的问题中得到正确了吗?
  • 好的,我知道了。 #define 通过“编译单元”进行,所以如果我编译一个库,那么除了 main.c 之外,库头还必须有 #define。通常我会把它放在 Makefile 中的全局 CFLAGS 中,现在放在每个“编译单元”的每个第一个标题中。您能否将此注释添加到末尾。
  • 我想我描述了这个;任何使用库头的地方,都需要#define。在某些程序中,它可能只是 main.cpp,但如果您在其他编译单元中使用头文件,您需要在那里做同样的事情。你说的是这个吗?
  • 是的,基本上就是这样。在 main.c 的简单程序顶部是可以的,但如果你编译库,每个库头都需要在开头有它。对于临时 C 用户(如我),这不清楚,因为 Makefile 中的 cflags 中的 -D 会自动为所有人执行此操作。简而言之:“我应该放哪个头文件?- 每个编译单元的每个头文件。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多