【发布时间】:2014-07-22 11:51:55
【问题描述】:
最近我有代码(在 C 中),其中我将 int 的地址传递给期望 pointer to unsigned char 的函数。这无效吗?这是 UB 还是什么?
例如,
void f(unsigned char*p)
{
// do something
}
// Call it somewhere
int x = 0; // actually it was uint32_t if it makes difference
f(&x);
我确实收到了警告...在 Xcode 中编译
【问题讨论】:
-
@EJEHardenberg 这与这里有什么关系?
-
@Sathish:你的意思是
f((unsigned char*)&x);,但问题是如果不使用演员表会发生什么? -
@dmcr_code 如果省略演员表,则代码格式错误。
-
@dmcr_code 不要将“语义”与“句法”混淆。也许您的编译器可以理解代码(尽管 C 标准不要求它这样做),并且很可能它将代码视为有强制转换。但是,如果一个格式错误的程序编译,它会自动具有未定义的行为。此外,一旦启用将警告视为错误的编译器标志,例如 GCC 的
-Werror,代码将无法编译。某些特定的代码段是否使用某些特定的编译器和标志进行编译是无关紧要的,也不是代码正确性的衡量标准。 -
@dmcr_code:来自 gcc 的警告可能意味着代码不严格符合。该标准允许实现编译尽可能多的无效程序,只要它编译所有有效程序(并在某些情况下提供“诊断消息”(对于 gcc,例如警告 is 诊断)案例,例如对于您的代码)。所以编译器允许拒绝编译你的代码并且需要给出诊断。
标签: c