如何通过C中的make更改宏定义

如何通过C中的make更改宏定义,c,makefile,macros,C,Makefile,Macros,所以我制作了一个C程序,它从一个静态无符号字符[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 u

所以我制作了一个C程序,它从一个静态无符号字符[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_大小,然后再通过一些命令或一些可以传递到make中的配置来编译程序

编辑1:


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

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

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

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

#ifndef M_SIZE
#define M_SIZE 50000
#endif
然后可以在编译器命令行上重写宏:

cc … -DM_SIZE=100000 …

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

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

#ifndef M_SIZE
#define M_SIZE 50000
#endif
然后可以在编译器命令行上重写宏:

cc … -DM_SIZE=100000 …

保留默认值,这样,如果省略编译器选项,代码仍能进行合理编译。您可以选择让编译失败,但这通常不是一个好的选择。

出于我的目的,我不能使用动态内存分配,但您的第一个建议应该有效。为什么不呢?除了在非常小的嵌入式系统上,动态内存管理应该没有问题……这实际上是一种新型的嵌入式系统编程语言-出于我的目的,我不能使用动态内存分配,但您的第一个建议应该有效。为什么不呢?除了在非常小的嵌入式系统上,动态内存管理应该没有问题……这实际上是一种新型的嵌入式系统编程语言-可能的重复可能的重复