C 不同的宏取决于文件包含的位置
我有一个C 不同的宏取决于文件包含的位置,c,C,我有一个master.c和slave.c文件。两者都是单独编译的,生成不同的模块 由于它们都使用类似的函数,我创建了一个helpers.h和helpers.c文件,并将#include“helpers.h”添加到main.c和slave.c以消除此函数的重复 此外,我需要使用中的LOG\u INFO功能登录slave.c/master.c和helpers.c。要求将宏LOG\u MODULE设置为模块的名称(Master或Slave) 大师c: B.c: 助手.h: 助手c: 我的问题如下: 即
master.c
和slave.c
文件。两者都是单独编译的,生成不同的模块
由于它们都使用类似的函数,我创建了一个helpers.h
和helpers.c
文件,并将#include“helpers.h”
添加到main.c
和slave.c
以消除此函数的重复
此外,我需要使用中的LOG\u INFO
功能登录slave.c
/master.c
和helpers.c
。要求将宏LOG\u MODULE
设置为模块的名称(Master
或Slave
)
大师c:
B.c:
助手.h:
助手c:
我的问题如下:
即使我在master.c
/slave.c
中定义了LOG\u模块后包含了“helpers.h”,但我仍然收到一个投诉,即当我在helpers.c
中使用LOG\u INFO
时,没有定义LOG\u模块
用slave.c
和master.c
中各自的值来定义LOG\u模块
,并让helpers.c
使用该定义,这是一个合适且优雅的解决方案。helpers.c
是一个单独的编译单元,在编译过程中,它只“看到”#define位于仅包含在该文件中的标题中
要实现您的目标,您需要:
将所有使用日志记录的函数的定义从.c移到.h文件
如果将master.c
和slave.c
链接在一起以创建单个二进制文件,则将日志记录函数内联到此标题中以防止链接问题
助手
I在定义日志模块后包括“helpers.h”
-否,LOG\u模块
未在此处定义。您显然包括了sys/log.h
,然后是helpers.h
。在helpers.c
中没有#定义日志模块
。这是到log.h的链接:您只在文件master.c
和slave.c
中定义log\u模块
,而不在helpers.c
中定义日志模块
在那file@Gerhardh是-使helpers.c
使用master.c
/slave.c
中相应的LOG\u模块
值的正确解决方案是什么?如果我在helpers.c
中定义LOG\u模块
,它将没有正确的值。除非您在传递该字符串的helpers.c
中向函数添加额外参数,不同的编译单元之间不共享任何宏。#主程序和从程序是独立的程序,它们在帮助程序中共享代码。分离构建,以便生成两个辅助对象:一个用于主对象,另一个用于从对象。然后在构建过程中定义cc参数-DLOG_MODULE=“where”
,例如在Makefile中。即使字符串文字与字符串文字连接一起使用,这也应该有效。我将do\u something
函数移动到helpers.h
并使其成为inline
。但是,我无法删除helpers.c
,因为它包含其他helper函数。不幸的是,编译失败,因为helpers.h
包含在helpers.c
中(因此未定义日志模块)。你建议我怎么做?关于你的第3点:master.c
和slave.c
从未链接在一起。要使这项工作正常,助手的所有功能都需要移动到.h文件中,或者至少移动到那些使用日志记录功能(需要LOG\u模块宏)的文件中。我知道,将编码到头文件中。此外,函数的内联可能会有问题。有些函数不能内联,例如,如果函数是递归的。您还需要确保它使用的所有函数都在其主体之前声明。最简单、最健壮的解决方案是,只需将代码保持原样,只需将helpers分配给它自己的LOG_模块定义,例如#define LOG_模块“helpers”
。我确实将所有需要LOG_模块宏的函数移到了helpers.h
。helpers.c
中的其余函数不使用LOG_模块宏。但是,由于我在helpers.c中包含了“helpers.h”,因此函数get内联在helpers.c编译单元中,该单元没有定义日志模块。
#define LOG_MODULE "Master"
#include "sys/log.h"
#include "helpers.h"
void main() {
do_something();
}
#define LOG_MODULE "Slave"
#include "sys/log.h"
#include "helpers.h"
void main() {
do_something();
}
void do_something();
#include "sys/log.h"
#include "helpers.h"
void do_something() {
...
LOG_INFO("Result: x");
...
}
#include "sys/log.h"
inline void do_something() {
...
LOG_INFO("Result: x");
...
}