【问题标题】:How to change macro definitions via make in C如何通过 C 中的 make 更改宏定义
【发布时间】:2018-10-29 13:23:58
【问题描述】:

所以我正在制作一个 C 程序,它从 static unsigned char[M_SIZE] 数组中获取内存,其中 M_SIZE 是一个宏。我需要做的是能够通过 make 中的命令更改该宏的值,以便有人可以根据传递给 make 的参数使用不同大小的保留内存编译程序。

我的头文件例子是DataStore.h

#ifndef DATA_STORE_H
#define DATA_STORE_H

#define M_SIZE 50000 // Need this to be configurable via make arguments

unsigned char* DataStore_get_buf(void);
unsigned char* DataStore_get_end(void);
void DataStore_inc_ptr(void);

#endif

我的示例 C 文件是 DataStore.c

#include "DataStore.h"

static unsigned char DataStore_BUFFER[M_SIZE];
static unsigned char* DataStore_PTR = DataStore_BUFFER;

unsigned char* DataStore_get_buf(void)
{
   return DataStore_BUFFER;
}

unsigned char* DataStore_get_end(void)
{
   return DataStore_BUFFER + M_SIZE;
}

void DataStore_inc_ptr(void)
{
    DataStore_PTR++;
}

所以基本上,我需要一种方法来更改 M_SIZE,然后再通过一些命令或一些可以传递给 make 的配置来编译程序。

编辑1:

这个问题很独特,因为我需要一种方法,不仅要传入可配置的宏值,还要处理该值未作为命令传入的情况,而是使用默认宏值。

【问题讨论】:

标签: c makefile macros


【解决方案1】:

如果您确定要在编译时设置固定大小,请修改标头以使用:

#ifndef M_SIZE
#define M_SIZE 50000
#endif

然后你可以在编译器命令行覆盖宏:

cc … -DM_SIZE=100000 …

保留默认值,以便如果省略编译器选项,代码仍然可以合理编译。相反,您可以决定希望编译失败,但这通常不是一个好的选择。

【讨论】:

    【解决方案2】:

    删除#define 并将值传递给编译器的命令行,如gcc -DM_SIZE=1000。或者更好的是,通过malloc 分配并将大小作为命令行参数传递,然后通过argv 检索它,这将允许在不重新编译的情况下更改大小。

    【讨论】:

    • 出于我的目的,我不能使用动态内存分配,但您的第一个建议应该可行。
    • 为什么不呢?除了非常小的嵌入式系统,动态内存管理应该没问题...
    • 这其实是针对嵌入式系统的一种新型编程语言。
    • 我认为 C 是旧的 ;-)
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多