Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不同的宏取决于文件包含的位置_C - Fatal编程技术网

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"); 
        ...
    }