c - 基于文件所在位置的不同宏
问题描述
我有一个master.c
和slave.c
文件。两者都是分开编译的,产生不同的连续模块。
由于它们都使用类似的功能,我创建了一个helpers.h
和helpers.c
文件,并添加#include "helpers.h"
到main.c
和slave.c
去重这个功能。
此外,我需要使用log.hLOG_INFO
中的函数同时登录/和 in 。log.h要求将宏设置为模块的名称(或)。slave.c
master.c
helpers.c
LOG_MODULE
Master
Slave
大师.c:
#define LOG_MODULE "Master"
#include "sys/log.h"
#include "helpers.h"
void main() {
do_something();
}
从属.c:
#define LOG_MODULE "Slave"
#include "sys/log.h"
#include "helpers.h"
void main() {
do_something();
}
助手.h:
void do_something();
助手.c:
#include "sys/log.h"
#include "helpers.h"
void do_something() {
...
LOG_INFO("Result: x");
...
}
我的问题如下:
即使我在定义LOG_MODULE
in master.c
/之后包含“helpers.h”,我仍然会收到关于在使用in时未定义slave.c
的抱怨。LOG_MODULE
LOG_INFO
helpers.c
什么是适当而优雅的解决方案来定义LOG_MODULE
它们各自的值slave.c
和master.c
,并使用该定义helpers.c
?
解决方案
这helpers.c
是一个单独的编译单元,在编译它的过程中,它只会“看到”该文件中包含的标头中的#define。
为了实现你想要的,你需要:
- 将所有使用日志记录的函数的定义从 .c 移至 .h 文件。
- 在此标头中内联日志记录函数,以防止链接问题
master.c
,slave.c
然后链接在一起以创建单个二进制文件。
助手.h
#include "sys/log.h"
inline void do_something() {
...
LOG_INFO("Result: x");
...
}
推荐阅读
- azure-devops - VSTS 分支策略可以应用于 GitHub 吗?
- couchdb - 我可以使用没有 url 的数据库名称在 CouchDB 中开始复制吗?
- android - 如何在房间数据库中使用多项选择
- sumo - SUMO 中的结果命令
- debugging - 如何在 VS Code 调试器开发中激活新的执行行和新文件
- oracle - 在 BIP 报告中传递参数
- typescript - 表示除未定义之外的所有内容的 TypeScript 类型
- c++11 - 如何在不对其进行 couts 的情况下减少浮点数小数位数
- javascript - 浏览器中的并行性
- c++ - 使用邻接表 C++ 实现 Dijkstra