#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?
...全文
969 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)
1) 本套课程针对高校大学生系统学习C语言而录制,从0基础入门讲起,循序渐进,通俗易懂,同时适用于计算机系及非计算机系的同学。通过学习可以帮助大家掌握C语言本质,轻松面对C语言全国二级考试,并达到能独立完成型C项目、C游戏的水平;2) 多数高校都开设了C语言课程,网上C语言课程也很多,但普遍存在两个问题: (1) 授课方式单一,大多是照着代码念一遍, 对刚刚接触编程的同学来说,感觉晦涩难懂 (2) 授课内容过度注重语法,没有项目实战支撑,造成课程枯燥无趣。本课程针对上述问题进行了改进 (1) 授课方式采用语法讲解+内存布局示意图+项目的方式,让课程生动有趣好理解 (2) 系统全面的讲解了C语言的核心技术点,还配套录制了《全国计算机二级C语言真题精讲》,让学员在掌握C语言编程的同时,还能轻松面对二级考试;3) 课程详细内容: 常量-变量、分支语句、循环语句、操作符和表达式、函数(库函数、自定义函数、递归调用 )、数组(一维数 组、二维数组、数组作为函数参数、指针数组)、指针(指针和指针类型、二级指针和多级指针、指针表达式解析、指针运算、数 组指针、函数指针、回调函数)、调试技巧、程序环境和预处理(翻译环境、运行环境、预定义符号、#define和#undef、宏和函 数、条件编译、文件包含)、 数据在内存的存储、内存块分配、static、字符函数和字符串函数、自定义类型(结构体、枚举 、联合)、动态内存管理、文件操作(i/o常量、i/o函数、流)。

16,470

社区成员

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

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

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