c - 强制在嵌入式 C 中最多包含一次
问题描述
我正在开发一个用 ANSI C 编写的嵌入式系统。它的价值在于 Pic32MX/MZ(我们两者都有系统),尽管它不应该是相关的。我也不能使用 C++ 或 Rust。
我编写了代码来控制外围设备。我只想允许 1 个其他文件引用此外围设备。
所以想象我有:
perihperal1.h
peripheral1.c
my_file1.c
myfile2.c
有什么办法可以确保只有 1 个my_file1.c
或myfile2.c
可以有#include perihperal1.h
?
我找不到在代码中强制它的方法,我宁愿强制它,而不是仅仅依靠良好的纪律。
编辑:
这样做的目的是我可以将硬件初始化代码与可能与所述外围设备交互的业务逻辑分开。
我想避免设置 UART,并将其包含在某个地方,然后将其也包含在其他地方。可以通过适当的纪律来完成,但在大型团队中经常会发生错误。
解决方案
如果有任何正当理由这样做,您可以这样做:
啊:
int unique_include_a = 1;
交流:
#include "a.h"
int a()
{
return 123;
}
int main()
{
a();
return 0;
}
公元前:
#include "a.h"
int b()
{
return 456;
}
编译和链接:
gcc a.c b.c
链接器应该发出错误:
/usr/bin/ld: /tmp/ccmC6JPZ.o:(.data+0x0): multiple definition of `unique_include_a'; /tmp/ccjvwQrZ.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
推荐阅读
- loops - 循环执行中的axios
- python - 使用来自多个文件的值构建矩阵
- php - 如何从收音机中选择选项并显示?
- typescript - 为什么在 TypeORM 中 where 和结合 Query Builder 不起作用?
- spring-test - Spring mockmvc 测试代码抛出 NoSuchMethodError。它只有设置部分
- c++ - 将新对象添加到 QQmlListProperty
- laravel - 使用 Laravel 获取最近 7 天的数据
- regex - Oracle - 为什么提供的正则表达式都不起作用?
- rust - 无法为“ring v0.16.12”运行自定义构建命令
- python-3.x - 在 pandas 中选择一个 df1 而不是 df2 中的行