怎么判断一个函数是否定义 [必加分!]
如何判断一个函数是否定义 [必加分!]
现在有如下一段程序:
#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
其他代码... ...
请指点,谢谢!
------解决方案--------------------
当然,如果你对C++的模板元编程有较高掌握度,你可以使用C++里的检测某个类是否有某个名字的成员函数功能,具体可看《More Exceptional C++》item4
------解决方案--------------------
自己写个makefile,实现两次编译,如果第一次编译失败,说明可能是你的函数没定义,在第二次编译时在编译选项里增加一个宏定义,你在代码里监测这个宏,如果定义了这个宏说明是在第二次编译,那么你就重定义一下这个函数。如果第二次编译也失败,那就可能是别的原因了
不过这个两次编译的手法只能用于检测函数是否同时被定义或没定义,要是需要分别检测,就不灵了
------解决方案--------------------
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命令),用宏是比较疯狂的,我觉得使用宏并不方便,也不灵活,建议还是选用其他思路吧
现在有如下一段程序:
#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
其他代码... ...
请指点,谢谢!
------解决方案--------------------
当然,如果你对C++的模板元编程有较高掌握度,你可以使用C++里的检测某个类是否有某个名字的成员函数功能,具体可看《More Exceptional C++》item4
------解决方案--------------------
自己写个makefile,实现两次编译,如果第一次编译失败,说明可能是你的函数没定义,在第二次编译时在编译选项里增加一个宏定义,你在代码里监测这个宏,如果定义了这个宏说明是在第二次编译,那么你就重定义一下这个函数。如果第二次编译也失败,那就可能是别的原因了
不过这个两次编译的手法只能用于检测函数是否同时被定义或没定义,要是需要分别检测,就不灵了
------解决方案--------------------
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命令),用宏是比较疯狂的,我觉得使用宏并不方便,也不灵活,建议还是选用其他思路吧