【问题标题】:Pro*C to C: cast to pointer from integer of different size [-Wint-to-pointer-cast] and note: in definition of macro 'TEND'Pro*C 到 C:从不同大小的整数转换为指针 [-Wint-to-pointer-cast] 并注意:在宏“TEND”的定义中
【发布时间】: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() 返回void ptr 吗?看来应该改成returnint
  • 旁注:有些人考虑在返回值周围放置额外的括号,这种风格不好('return is not a function')。如果你碰巧写过 C++,那么请注意这些括号实际上会改变语义(例如,阻止返回值优化;在最坏的情况下,它们甚至会导致无效代码:decltype(auto) f() { int n; return (n); } 会返回一个(悬空!)对@987654338 的引用@)。

标签: c compilation proc


【解决方案1】:

这个警告...

从不同大小的整数转换为指针 [-Wint-to-pointer-cast] 并注意:在宏 'TEND' 的定义中

... 没有传达所呈现功能中的固有错误。允许执行这样的转换。

但是一种不好的代码味道,因为没有理由期望得到的指针值对于访问对象是有效的。唯一(合理)安全的事情是存储它,传递它,并将其转换回整数,前两者仅在上下文保留值的(缺乏)重要性的情况下才是安全的。

目前尚不清楚为什么您的特定编译器会警告TEND() 的一种用法,而不会警告另一种用法。可以想象,宏 INT 在这两个上下文中的定义不同,但我的猜测是它与第二次使用还涉及将指针隐式转换回 INT 的事实有关(并且另请注意,如果INT 实际上是整数类型,则允许不进行强制转换是对标准 C 的扩展。

此外,我观察到突出显示的问题取决于上下文。 C 整数和指针类型的大小因 C 实现而异,在不久的过去,void *int 的大小相同是很常见的。人们不会期望整数大小与指针大小匹配的实现会为您的代码提供诸如您询问的警告。 然而,这并不意味着代码会更正这样的实现。无论是否发出警告,它可能会也可能不会,就像在您的特定用法中可能仍然可以,尽管有警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2015-06-04
    • 2021-03-10
    • 1970-01-01
    • 2022-12-11
    • 2014-03-20
    相关资源
    最近更新 更多