宏定义

墙角无名氏 2014-11-14 05:32:20
关于宏定义的问题
定义宏A
#define A fun()

函数 fun()
LPCTSTR fun(){
return A ;
}
这样肯定会内存溢出的,

但是现在看的一个项目,逻辑就是这样,
用的时候 CString str = A;
在跟进到函数fun()里头时,A已经被附了值了,而不是再调用函数fun

有没有人给个思路,这个值会是在哪附上的,或者怎么调试,知道函数fun中A的值是从哪来的
...全文
141 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
墙角无名氏 2014-11-17
  • 打赏
  • 举报
回复
问题我找到原因了,是我没仔细看的原因。
是这样的逻辑
#define A fun()

LPCTSTR fun(){
return A ;
}

这还有个
const static TCHAR* const A= _T("XXX");


因为我思维定势了,觉得A就是一个宏,不过我觉得编译器怎么知道用A的时候,该用哪个呢
谢谢大家!
Sandrer 2014-11-15
  • 打赏
  • 举报
回复
实际返回的是函数指针 话说你这样定义有意义吗
BeanJoy 2014-11-14
  • 打赏
  • 举报
回复
引用 8 楼 j412500550 的回复:
[quote=引用 5 楼 BeanJoy 的回复:] [quote=引用 2 楼 j412500550 的回复:] ... 然后再跟进函数,发现A B C的值还是原来的值,这就让我更迷惑了
没看懂,A B C是宏,又不是变量或者其他,在调试的时候,不知道怎么看A B C的值。[/quote] 在用A的地方加断点啊,比如 CString str = A; 然后F11跟进,会到函数fun1里头啊,这时看返回值 return A; //A的值可以看的到的 [/quote] 无图无真相,将你调试的截图上上来。
墙角无名氏 2014-11-14
  • 打赏
  • 举报
回复
引用 5 楼 BeanJoy 的回复:
[quote=引用 2 楼 j412500550 的回复:] ... 然后再跟进函数,发现A B C的值还是原来的值,这就让我更迷惑了
没看懂,A B C是宏,又不是变量或者其他,在调试的时候,不知道怎么看A B C的值。[/quote] 在用A的地方加断点啊,比如 CString str = A; 然后F11跟进,会到函数fun1里头啊,这时看返回值 return A; //A的值可以看的到的
墙角无名氏 2014-11-14
  • 打赏
  • 举报
回复
引用 4 楼 xihu1364 的回复:

#define  A      fun()

 LPCTSTR   fun()
{
   return A ;//这里又是调用fun
}

void main()
{
    CString s = A; //这里调用fun
}

//这个程序不是死循环????
这个是死循环,对的。 我看的工程里头,逻辑就是这样的 我的想法是,工程在别的地方又定义了一个A,然后再调用函数fun的时候,返回的A是别的地方定义的。 但是从代码中搜索A的话,也没看到在哪定义了
版主大哥 2014-11-14
  • 打赏
  • 举报
回复
#define 就是代替的意思 看看...

 LPCTSTR   fun()
{
   return fun() ;
}
void main()
{
    CString s = fun(); 
}
BeanJoy 2014-11-14
  • 打赏
  • 举报
回复
引用 2 楼 j412500550 的回复:
... 然后再跟进函数,发现A B C的值还是原来的值,这就让我更迷惑了
没看懂,A B C是宏,又不是变量或者其他,在调试的时候,不知道怎么看A B C的值。
版主大哥 2014-11-14
  • 打赏
  • 举报
回复

#define  A      fun()

 LPCTSTR   fun()
{
   return A ;//这里又是调用fun
}

void main()
{
    CString s = A; //这里调用fun
}

//这个程序不是死循环????
墙角无名氏 2014-11-14
  • 打赏
  • 举报
回复
引用 1 楼 xihu1364 的回复:
[quote=引用 楼主 j412500550 的回复:] 关于宏定义的问题 定义宏A #define A fun() 函数 fun() LPCTSTR fun(){ return A ; } 这样肯定会内存溢出的,
这里会循环调用....死循环! 后面说的 好像没看懂[/quote] 就是现在看的一个工程,里头有这样的一个逻辑 定义一个宏 为一个函数,但是这个函数直接返回这个宏, 然后用这个宏的时候,没有出现所谓的死循环,而是函数中的那个宏有了一个值,是一个常量
墙角无名氏 2014-11-14
  • 打赏
  • 举报
回复
补充下 这样的宏有很多, #define A fun1() #define B fun2() #define C fun3() LPCTSTR fun1(){ return A ; } LPCTSTR fun2(){ return B ; } LPCTSTR fun3(){ return C ; } 这时候 在用A,B,C的时候,比如 CString str =A; 调试进入函数fun1的时候,A,B,C都已经有值了,搞不懂这些值是从哪来的; 而且我试了下 将宏定义 #define A fun1() #define B fun2() #define C fun3() 改为 #define A fun1() #define B fun1() #define C fun1() 然后再跟进函数,发现A B C的值还是原来的值,这就让我更迷惑了
版主大哥 2014-11-14
  • 打赏
  • 举报
回复
引用 楼主 j412500550 的回复:
关于宏定义的问题 定义宏A #define A fun() 函数 fun() LPCTSTR fun(){ return A ; } 这样肯定会内存溢出的,
这里会循环调用....死循环! 后面说的 好像没看懂

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧