我在另一个类上声明的宏来管理跟踪时遇到问题。
当我使用 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);
但是它不起作用!你能帮帮我吗?提前致谢
此警告...
从不同大小的整数 [-Wint-to-pointer-cast] 强制转换为指针,并注意:在宏"TEND"的定义中
。不会传达所呈现函数中的固有错误。 允许执行此类转换。
但是它有一个不好的代码气味,因为没有理由期望生成的指针值对于访问对象是有效的。 唯一(合理地(安全做的事情是存储它,传递它,然后将其转换回整数,而前两者仅在上下文保留值的(缺乏(重要性的情况下是安全的。
目前还不清楚为什么您的特定编译器会警告TEND()
的一种用途,而不是另一种用途。 可以想象,宏INT
在这两种上下文中的定义不同,但我的猜测是,这与第二次使用还涉及将指针隐式转换回INT
这一事实有关(另请注意,如果INT
实际上是整数类型,则允许在没有强制转换的情况下是对标准 C 的扩展(。
此外,我注意到所强调的问题取决于具体情况。 C 整数和指针类型的大小因 C 实现而异,并且在不太遥远的过去,void *
的大小通常与int
相同。人们不会期望整数大小与指针大小匹配的实现为您的代码显示警告,例如您询问的警告。但是,这并不意味着代码会针对此类实现进行更正。 无论是否发出警告,它都可能是也可能不是,就像在您的特定用法中它可能仍然可以一样,尽管有警告。