【发布时间】:2019-08-22 09:55:36
【问题描述】:
我在另一个类上声明的用于管理跟踪的宏有问题。
当我使用 TEND ((void *) iRet) 时,我尝试为这种情况创建另一个宏,但它也不起作用......
类跟踪.h:
#define TEND(val) DTRACE(XZC_N0, "End - Returned value", val) \
return(val);
类使用宏但错误!:
void *traitReponse( void *pv )
{
INT iRet = XZC_OK;
iRet = inserBDTR(rsltDemande, pchDateRecherche, pchDateDeb, pchDateFin, pchLogin, pchISDN, pchEntite);
TEND ((void *) iRet)
}
使用宏的类在没有警告的情况下正常工作:
INT bdDisconnectDb ( )
{
INT iRet = XZC_OK;
TBEGIN
if (0 != sqlca.sqlcode)
{
iRet = XZC_NOK;
goto FIN_FONCTION;
}
else
{
TRACE(XZC_N2, "Disconnection successful")
}
FIN_FONCTION :
TEND (iRet)
}
编译通过了,但我有这些警告:
In file included from tmp_ProcA.c:263:0:
tmp_ProcA.c: In function 'traitDemande':
tmp_ProcA.c:1514:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
TEND ((void *) (iRet))
^
xzenvir.h:255:12: note: in definition of macro 'TEND'
return(val);
^
In file included from ProcA.c:263:0:
ProcA.c: In function 'traitDemande':
ProcA.c:1514:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
TEND ((void *) (iRet))
^
xzenvir.h:255:12: note: in definition of macro 'TEND'
return(val);
^
In file included from bdconn.h:38:0,
from tmp_ProcB.c:263:
tmp_ProcB.c: In function 'traitReponse':
tmp_ProcB.c:1104:7: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
TEND ((void *) (iRet))
^
xzenvir.h:255:12: note: in definition of macro 'TEND'
return(val);
^
In file included from bdconn.h:38:0,
from ProcB.c:263:
ProcB.c: In function 'traitReponse':
ProcB.c:1104:7: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
TEND ((void *) (iRet))
^
xzenvir.h:255:12: note: in definition of macro 'TEND'
return(val);
^
我尝试创建另一个这样的宏:
#define TEND_PROC((void *) val) DTRACE(XZC_N0, "End - Returned value", val) \
return(val);
但它不起作用!你能帮我么?提前致谢
【问题讨论】:
-
OT:您对
goto的使用是有问题的。 -
您的
goto实际上并没有错,它的用法只是值得怀疑。这是一条“离题”评论,表明您的代码中存在与您的问题无关的另一个问题。阅读this了解更多信息 -
不!
iRET也不是int *,为什么要返回INT,函数的返回类型是void *? -
有什么理由从
traitReponse()返回voidptr 吗?看来应该改成returnint -
旁注:有些人考虑在返回值周围放置额外的括号,这种风格不好('return is not a function')。如果你碰巧写过 C++,那么请注意这些括号实际上会改变语义(例如,阻止返回值优化;在最坏的情况下,它们甚至会导致无效代码:
decltype(auto) f() { int n; return (n); }会返回一个(悬空!)对@987654338 的引用@)。
标签: c compilation proc