看stm32厂商的源代码中用到了非常多的#define,很自然的会问#define是否占用内存。
eg:
/* Flash Control Register bits */
#define CR_PG_Set ((uint32_t)0x00000001)
#define CR_PG_Reset ((uint32_t)0x00001FFE)
#define CR_PER_Set ((uint32_t)0x00000002)
#define CR_PER_Reset ((uint32_t)0x00001FFD)
=======================================================
回答1.(猜测性的回答)
我想stm32飞07的芯片内存只有10几K,如果#define 占用内存的话,肯定是内存不够的。
所有#define是不占据内存的。
回答2.(理论上)
#define 理论上是在编译器编译的时候直接替代成具体的值的。
换句话说#define 必需是明确的东西,不能是变化的。更好理解的是#define 相当于取一个别名。
例如,我们给李晓明取一个昵称,叫妞妞, 当李晓明听到妞妞时,就知道是叫自己。仅此而起。
#define 妞妞 李晓明
回答3(实验,实验环境 VS2010 控制台程序)
猜测和理论上都讨论过了,现在是验证性的证明。
程序代码如下
- #include "iostream"
-
-
using namespace std;
-
#define MAX_VALUE 23
-
-
int main()
-
{
-
int c = 100;
-
int a = MAX_VALUE;
-
int b = a;
-
-
getchar();
-
return 1;
-
}
我们在c,a,b上设置断点,单步跟踪,然后我们查看c,a,b的变量值。
选择变量c然后右键点击《添加监视(W)》 我们可以看到 a,b,c都是可以被监视的,说明a,b,c是在内存中存在的。 MAX_VALUE 是不能被监视的。 说明在内存中是不存在的。
如果你认为上面的还不能证明的话,那我们来看看汇编,按 ALT + 8
- #include "iostream"
-
-
using namespace std;
-
-
#define MAX_VALUE 23
-
-
int main()
-
{
-
00C313B0 push ebp
-
00C313B1 mov ebp,esp
-
00C313B3 sub esp,0E4h
-
00C313B9 push ebx
-
00C313BA push esi
-
00C313BB push edi
-
00C313BC lea edi,[ebp-0E4h]
-
00C313C2 mov ecx,39h
-
00C313C7 mov eax,0CCCCCCCCh
-
00C313CC rep stos dword ptr es:[edi]
-
int c = 100;
-
00C313CE mov dword ptr [c],64h
-
int a = MAX_VALUE;//我们看这一行的代码转化成汇编就是下一行(00C313D5),直接用17h代替了MAX_VALUE。
-
00C313D5 mov dword ptr [a],17h
-
int b = a;
-
00C313DC mov eax,dword ptr [a]
-
00C313DF mov dword ptr [b],eax
-
-
getchar();
-
00C313E2 mov esi,esp
-
00C313E4 call dword ptr [__imp__getchar (0C382D4h)]
-
00C313EA cmp esi,esp
-
00C313EC call @ILT+300(__RTC_CheckEsp) (0C31131h)
-
return 1;
-
00C313F1 mov eax,1
-
}
-
00C313F6 pop edi
-
00C313F7 pop esi
-
00C313F8 pop ebx
-
00C313F9 add esp,0E4h
-
00C313FF cmp ebp,esp
-
00C31401 call @ILT+300(__RTC_CheckEsp) (0C31131h)
-
00C31406 mov esp,ebp
-
00C31408 pop ebp
-
00C31409 ret
-
--- 无源文件 -----------------------------------------------------------------------
-
00C3140A int 3
-
00C3140B int 3
-
00C3140C int 3
看到这里,各位看官已经完全可以大胆的在嵌入式中使用很多的#define 不用担心吃掉你的内存。
阅读(4382) | 评论(0) | 转发(0) |