如何判断一个函数是否定义 [必加分!]

blackpool 2007-07-25 01:59:26
现在有如下一段程序:
#define PRINTOUT_RES( fileName ) \
PrintTest * pPrint##fileName=new PrintCaller<PrintFixture>( \
printCon.getFileName( # fileName )) \
pPrint##fileName->m_pPrintDoc=fileName##_Doc; \
... ... (省略)

其中m_pPrintDoc是一个函数指针,可以用来调用函数fileName##_Doc
而且,每次循环都会调用不同的fileName##_Doc函数,随着fileName
改变。m_pPrintDoc在别处有定义。

现在的情况是不一定有fileName##_Doc被定义,请问怎么写一个条件
语句,在没有定义fileName##_Doc的情况下做其他操作呢?如何判断
一个函数是否定义? 就像:
#define PRINTOUT_RES( fileName ) \
if 定义 fileName##_Doc \
PrintTest * pPrint##fileName=new PrintCaller<PrintFixture>( \
printCon.getFileName( # fileName )) \
pPrint##fileName->m_pPrintDoc=fileName##_Doc; \
else
其他代码... ...

请指点,谢谢!
...全文
2524 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yc_8301 2007-08-01
  • 打赏
  • 举报
回复
学习中。。。。
lzxjxsy 2007-07-27
  • 打赏
  • 举报
回复
vxworks中有一个查找符号表的函数,符号表就包括函数名和变量名,windows不是很熟悉,不知道是否也提供这样的函数呢?
ReverseEngineering 2007-07-26
  • 打赏
  • 举报
回复
发重复了!
ReverseEngineering 2007-07-26
  • 打赏
  • 举报
回复
学习一下
ReverseEngineering 2007-07-26
  • 打赏
  • 举报
回复
学习一下
lddLinan 2007-07-26
  • 打赏
  • 举报
回复
__if_exists should only be used within the body of a function. Outside of the body of a function __if_exists can only refer to fully defined types. The Visual C++ compiler must know what members a class template has before any instantiations.

http://msdn2.microsoft.com/en-us/library/x7wy9xh3(VS.80).aspx
blackpool 2007-07-26
  • 打赏
  • 举报
回复
谢谢关注
krfstudio 2007-07-26
  • 打赏
  • 举报
回复
如果你用 VC7 或更高版本的 VC,可以使用 MS 自己定义的关键字 __if_exists
CsCcm 2007-07-25
  • 打赏
  • 举报
回复
wengch说得好,楼主可否换个思路

如果你非要这样做可以这样解决,如taodm所言,提供两个宏

定义宏
#define PRINTOUT_RES( fileName ) \
PrintTest * pPrint##fileName=new PrintCaller<PrintFixture>( \
printCon.getFileName( # fileName )); \
pPrint##fileName->m_pPrintDoc=fileName##_Doc;

#define PRINTOUT_RES_UD( fileName ) \
PrintTest * pPrint##fileName=new PrintCaller<PrintFixture>( \
printCon.getFileName( # fileName )); \
pPrint##fileName->m_pPrintDoc=0;

调用时
#ifdef XIXI_Doc
PRINTOUT_RES( XIXI )
#else
PRINTOUT_RES_UD( XIXI )
#endif

楼主可以把编译预处理之后的代码打出来看看(用g++ -E file.cpp命令),用宏是比较疯狂的,我觉得使用宏并不方便,也不灵活,建议还是选用其他思路吧



wengch 2007-07-25
  • 打赏
  • 举报
回复
真的是很糟糕的思路,没有定义函数却调用该宏,责任完全在客户端.
blackpool 2007-07-25
  • 打赏
  • 举报
回复
要是taodm老大是我老板就好了 可惜所有老板都是险恶的: )

继续关注

继续思考
taodm 2007-07-25
  • 打赏
  • 举报
回复
提供2个宏,由用户根据自己有没有定义fileName##_Doc而自己选择调哪个宏。
不要把所有职责都揽在你的怀里。
blackpool 2007-07-25
  • 打赏
  • 举报
回复
不知道是不是我没有描述清楚 我的问题是fileName##_Doc在别的地方有声明和定义 但是我在PRINTOUT_RES宏里要去调用这个fileName##_Doc函数

但是使用我定义的PRINTOUT_RES宏的用户并不一定需要调用这个fileName##_Doc函数,如果他们要用到fileName##_Doc函数他们会做声明,然后通过函数指针调用到

现在的问题是有的用户不用的话我直接这么写,就会造成undeclared identifier的错误

我就是想判断出有没有fileName##_Doc被用户声明,如果根本没有声明,那
pPrint##fileName->m_pPrintDoc=fileName##_Doc;
也是根本没有意义的,因为不存在fileName##_Doc

怎么判断有没有fileName##_Doc呢?

谢谢指点!
wengch 2007-07-25
  • 打赏
  • 举报
回复
如果需要判断一个函数是否存在,请重新审视一下你的设计吧.
lockhall 2007-07-25
  • 打赏
  • 举报
回复
代码中不必这么做吧

用第三方工具检查倒是可以。
lddLinan 2007-07-25
  • 打赏
  • 举报
回复
自己写个makefile,实现两次编译,如果第一次编译失败,说明可能是你的函数没定义,在第二次编译时在编译选项里增加一个宏定义,你在代码里监测这个宏,如果定义了这个宏说明是在第二次编译,那么你就重定义一下这个函数。如果第二次编译也失败,那就可能是别的原因了

不过这个两次编译的手法只能用于检测函数是否同时被定义或没定义,要是需要分别检测,就不灵了
blackpool 2007-07-25
  • 打赏
  • 举报
回复
真的没什么简单的办法吗?

如果没有声明printFollow_Doc就会出现如下错误,怎样才能检测到有没有声明此函数呢: (

error C2065: 'printFollow_Doc' : undeclared identifier
taodm 2007-07-25
  • 打赏
  • 举报
回复
当然,如果你对C++的模板元编程有较高掌握度,你可以使用C++里的检测某个类是否有某个名字的成员函数功能,具体可看《More Exceptional C++》item4
sparkkendy 2007-07-25
  • 打赏
  • 举报
回复
用#ifdef
taodm 2007-07-25
  • 打赏
  • 举报
回复
抱歉,你无法检测这一点。你只能要求别人声明fileName##_Doc函数时,同时一定要提供一个宏,你只能检测那个宏。
但是,如果别人只声明了函数而不定义函数,你是无法检测的。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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