C内存空间和#defines

the*_*e_e 5 c embedded memory-management

我正在研究嵌入式系统,所以内存对我来说很宝贵.

一个经常出现的问题是,在尝试为它编译程序时,我的内存空间已经用完了.这通常通过限制可能占用大量空间的typedef等的数量来解决.

有一个宏生成器,我用它来创建一个包含很多#define的文件.其中一些是简单的值,另一些是边界检查

#define SIGNAL1 (float)0.03f
#define SIGNAL1_ISVALID(value) ((value >= 0.0f) && (value <= 10.0f))
Run Code Online (Sandbox Code Playgroud)

现在,我没有使用所有这些定义.我使用了一些,但实际上并不是大多数.我被告知,如果不使用它们,它们实际上并没有占用任何记忆,但我不确定这一点.我希望通过删除未使用的那些我可以释放一些额外的内存(但同样,我被告知这是毫无意义的).

未使用的#define会占用任何内存空间吗?

Ana*_*tts 20

不,除非使用#defines,否则#defines不会占用空间 - #define类似于find/replace; 只要编译器看到左半部分,它就会在实际编译之前用右半部分替换它.

所以,如果你有:

float f = SIGNAL1;
Run Code Online (Sandbox Code Playgroud)

编译器将逐字解释该语句:

float f = (float)0.03f;
Run Code Online (Sandbox Code Playgroud)

永远不会看到SIGNAL1,它不会出现在调试器等中.

  • 实际上,预处理器进行宏替换.当源代码到达实际编译器时,所有宏调用都被文本替换为它们被定义为的任何内容.这意味着在宏中使用两次参数有点危险,因为如果参数类似于`i ++`,那么每次参数出现在宏扩展中时,`i`都会递增.所以`SIGNAL1_ISVALID(++ i)`扩展为`((++ i> = 0.0f)&&(++ i <= 10.0f))` (4认同)