#define 中包含 #if的问题

Toonyxm 2010-04-22 07:27:52
想实现类似于这样的功能.

调用宏
FUNCTION(aasdasdasd)
展开效果为

#if bCanReturn
int aasdasdasd();
#else
void aasdasdasd();
#endif

然后想到的写法就是
#define FUNCTION(f)\
#if bCanReturn\
int f ();\
#else\
void f ();\
#endif
但编译时#if处会报错....


修改为
#define FUNCTION(f)\
\#if bCanReturn\
int f ();\
\#else\
void f ();\
\#endif
依旧报错..


这个有什么解决办法么? 还是说#define的宏内部不能有#if?
...全文
970 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
sb3day 2012-03-14
  • 打赏
  • 举报
回复
我也解决了,再建一个cpp文件转一下
#include "SameNameHelper.h"
#include "Dialog.h"
//CSameNameHelper::CSameNameHelper(void)
//{
//}
//
//CSameNameHelper::~CSameNameHelper(void)
//{
//}

const char* GetDialogClassName(CWndObject* pWnd)
{
return (static_cast<CDialog*>(pWnd))->GetDialogClassName();
}
sb3day 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 toonyxm 的回复:]
想到其他解决方案了,散分.
[/Quote]最bs最后看到这结果的!什么解决方案,让我们百度过来的人知道一下吧
Toonyxm 2010-04-22
  • 打赏
  • 举报
回复
想到其他解决方案了,散分.
安全方案 2010-04-22
  • 打赏
  • 举报
回复
这个 学习学习。。
尹成 2010-04-22
  • 打赏
  • 举报
回复
#ifdef
#define
#endif

#ifndef
#define
#endif
zyq5945 2010-04-22
  • 打赏
  • 举报
回复
宏是没办法知道你的变量是多少,宏在预编的时候已经预处理处理完了,变量是程序运行的时候才知道是多少。
Toonyxm 2010-04-22
  • 打赏
  • 举报
回复
上面代码乱了,部一下..
其中xxx提前定义好的布尔型变量

#define AAAAAA \
\#if xxx\ //左边是宏AAAAAA的内容, 不是新的宏
...\ //左边是宏AAAAAA的内容,不是新的宏
\#else\ //左边是宏AAAAAA的内容,不是新的宏
...\ //左边是宏AAAAAA的内容,不是新的宏
\#endif //左边是宏AAAAAA的内容,不是新的宏
Toonyxm 2010-04-22
  • 打赏
  • 举报
回复
可能是我说明的不是很清楚...大家误解我的意思了....抱歉...
首先,我要用的是#if而不是#ifdef
然后,bCanReturn是之前定义的一个布尔型变量(1楼里我忘记说了.... = =..)

我只是想问下在#define宏中,宏本体里可以出现#if吗?

因为#define宏的展开就是文本替换.
我想让它展开的时候出现#if

比如说一个宏主体有多行内容AAAAAA:

#define AAAAAA \
\#if xxx\ //左边是宏AAAAAA的内容,不是新的宏
...\ //左边是宏AAAAAA的内容,不是新的宏
\#else\ //左边是宏AAAAAA的内容,不是新的宏
...\ //左边是宏AAAAAA的内容,不是新的宏
\#endif //左边是宏AAAAAA的内容,不是新的宏

然后我们使用AAAAAA宏的地方会替换成
#if xxx
...
#else
...
#endif
你妹的特盗不 2010-04-22
  • 打赏
  • 举报
回复
用#if 的话,你的那个必须是定义了的,不然程序会报错,因为编译找不到
所以一般正常写法是

#ifdef xxxx//如果定义了
#if xxxx//如果true
.....
#else
....
#endif
#endif

随手写的
zyq5945 2010-04-22
  • 打赏
  • 举报
回复
#ifndef _FUNCTION
#define _FUNCTION
#ifdef bCanReturn //bCanReturn只能是个宏,而且最好大写
#define FUNCTION(f) int f() //宏最好不要加分号结尾
#else
#define FUNCTION(f) void f()
#endif
#endif
zyq5945 2010-04-22
  • 打赏
  • 举报
回复
#ifdef _FUNCTION
#define _FUNCTION
#ifdef bCanReturn //bCanReturn只能是个宏,而且最好大写
#define FUNCTION(f) int f() //宏最好不要加分号结尾
#else
#define FUNCTION(f) void f()
#endif
#endif
kemee 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]

#ifdef
#define
#endif

#ifndef
#define
#endif
[/Quote]
这个正解

楼主先了解一下宏。。
D3DEB21 2010-04-22
  • 打赏
  • 举报
回复
楼主这样改,肯定不行,因为宏定义的关键字一行只能有一个
用户 昵称 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jszj 的回复:]
位置反过来就行了:

#if bCanReturn
#define FUNCTION(f) int f ();
#else
#define FUNCTION(f) void f ();
#endif
[/Quote]
.......
Sou2012 2010-04-22
  • 打赏
  • 举报
回复
。。。楼主先看一下宏的使用手册吧。。。不用这样乱写的。
lghndyz 2010-04-22
  • 打赏
  • 举报
回复
#ifndef x
  #define x
  ...
  #endif
  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等
  #ifndef x
  //先测试x是否被定义过
  #define x
  //如果没有定义下面就定义x并执行下面的语句
  ...
  #endif
  //如果已经定义了则执行#endif后面的语句
Eleven 2010-04-22
  • 打赏
  • 举报
回复
#ifdef
#define
#endif

#ifndef
#define
#endif
bragi523 2010-04-22
  • 打赏
  • 举报
回复
bCanReturn不会是变量吧?
songtao_01 2010-04-22
  • 打赏
  • 举报
回复
貌似不能有#if了
red-fly 2010-04-22
  • 打赏
  • 举报
回复
位置反过来就行了:

#if bCanReturn
#define FUNCTION(f) int f ();
#else
#define FUNCTION(f) void f ();
#endif
加载更多回复(3)

16,471

社区成员

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

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

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