首页 > 解决方案 > 基于文件所在位置的不同宏

问题描述

我有一个master.cslave.c文件。两者都是分开编译的,产生不同的连续模块。

由于它们都使用类似的功能,我创建了一个helpers.hhelpers.c文件,并添加#include "helpers.h"main.cslave.c去重这个功能。

此外,我需要使用log.hLOG_INFO中的函数同时登录/和 in 。log.h要求将宏设置为模块的名称(或)。slave.cmaster.chelpers.cLOG_MODULEMasterSlave

大师.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_MODULEin master.c/之后包含“helpers.h”,我仍然会收到关于在使用in时未定义slave.c的抱怨。LOG_MODULELOG_INFOhelpers.c

什么是适当而优雅的解决方案来定义LOG_MODULE它们各自的值slave.cmaster.c,并使用该定义helpers.c

标签: c

解决方案


helpers.c是一个单独的编译单元,在编译它的过程中,它只会“看到”该文件中包含的标头中的#define。

为了实现你想要的,你需要:

  1. 将所有使用日志记录的函数的定义从 .c 移至 .h 文件。
  2. 在此标头中内联日志记录函数,以防止链接问题master.cslave.c然后链接在一起以创建单个二进制文件。

助手.h

#include "sys/log.h"
inline void do_something() {
    ...
    LOG_INFO("Result: x"); 
    ...
}

推荐阅读