通过将函数指针转换为void函数然后调用它来“破坏”返回值是否是未定义的行为?

用户名

说,像这样:

int SayHelloThenReturnTen(void) {
    puts("Hello world");
    return 10;
}

然后再:

((void(*)(void))SayHelloThenReturnTen)();

这样安全吗?通过强制转换为void指针“破坏”返回值是否安全?这是安全的跨平台平台,还是这种不确定的行为

约翰·布林格

这样安全吗?

将函数指针强制转换为任何函数指针类型都是安全的。将结果强制转换回原始类型将产生一个等于原始指针的指针值。

它是不是安全的,但是,要调用通过类型与它所指向的功能不兼容的函数指针的函数。该标准的第6.3.2.3/8段明确规定了这一点:

可以将指向一种类型的函数的指针转换为指向另一种类型的函数的指针,然后再次返回。结果应等于原始指针。如果使用转换后的指针来调用其类型与引用的类型不兼容的函数,则该行为是不确定的。

(添加了强调)

通过强制转换为void指针“破坏”返回值是否安全?

您的示例并未证明这一点。相反,它演示了使用void返回类型转换为函数指针类型。再次,演员表还可以,但调用不行。

这是安全的跨平台平台,还是这种不确定的行为?

这是不安全的,并且具有未定义的行为。而且,绝对没有任何好处。您可以根据需要简单地忽略该函数的返回值。如果您要尝试使编译器警告静音,那么,

  1. 考虑到编译器可能有一点,并且
  2. 如果你想传达给编译器,你真的要忽略的返回值,那么它是更清晰,更简单,安全地投对无效:

    (void) SayHelloThenReturnTen();
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将函数指针reinterpret_cast与void(*)()比较是否为未定义行为?

来自分类Dev

函数返回值未定义

来自分类Dev

C - 将函数调用返回值强制转换为 void

来自分类Dev

如果通过调用另一个noreturn函数返回,则从noreturn函数返回的行为是否未定义?

来自分类Dev

如果通过调用另一个noreturn函数返回,则从noreturn函数返回的行为是否未定义?

来自分类Dev

将数据移入函数然后返回到数据源时是否存在未定义的行为问题?

来自分类Dev

函数返回值返回未定义

来自分类Dev

未定义:在不返回但仅调用“ab”的函数“cd”内调用具有返回值的函数“ab”

来自分类Dev

异步函数不返回值,但在调用未定义的打字稿后显示

来自分类Dev

JavaScript函数返回值未定义

来自分类Dev

将构造函数转换为函数的返回值

来自分类Dev

当我使用void函数的返回值(通过强制转换函数指针)时,会发生什么?

来自分类Dev

使用函数将未定义的变量转换为函数

来自分类Dev

是否通过未定义的“函数”左值调用“ noexcept函数”?

来自分类Dev

是否将reinterpret_cast的派生类指针转换为基类指针未定义的行为?

来自分类Dev

将php函数返回值转换为true / false

来自分类Dev

将字符转换为整数并返回值的函数 [C]

来自分类Dev

为什么某些函数既通过返回值又通过写入传递的指针来返回结果?

来自分类Dev

将int指针转换为void指针并返回以在另一个函数中使用该值?

来自分类Dev

破坏可能返回未定义的函数的返回

来自分类Dev

自调用函数返回“未定义”

来自分类Dev

js函数调用返回未定义

来自分类Dev

将(文件读取)函数返回值转换为c_str()行为不符合预期

来自分类Dev

函数的参数是未定义的,但我通过所有必需的参数调用它

来自分类Dev

匿名函数转换为void返回的委托无法返回值

来自分类Dev

即使返回值,异步函数也会返回未定义的

来自分类Dev

宏可以通过强制转换为void来模仿void返回函数吗?

来自分类Dev

宏可以通过强制转换为void来模拟void返回函数吗?

来自分类Dev

C中的void函数指针返回值

Related 相关文章

  1. 1

    将函数指针reinterpret_cast与void(*)()比较是否为未定义行为?

  2. 2

    函数返回值未定义

  3. 3

    C - 将函数调用返回值强制转换为 void

  4. 4

    如果通过调用另一个noreturn函数返回,则从noreturn函数返回的行为是否未定义?

  5. 5

    如果通过调用另一个noreturn函数返回,则从noreturn函数返回的行为是否未定义?

  6. 6

    将数据移入函数然后返回到数据源时是否存在未定义的行为问题?

  7. 7

    函数返回值返回未定义

  8. 8

    未定义:在不返回但仅调用“ab”的函数“cd”内调用具有返回值的函数“ab”

  9. 9

    异步函数不返回值,但在调用未定义的打字稿后显示

  10. 10

    JavaScript函数返回值未定义

  11. 11

    将构造函数转换为函数的返回值

  12. 12

    当我使用void函数的返回值(通过强制转换函数指针)时,会发生什么?

  13. 13

    使用函数将未定义的变量转换为函数

  14. 14

    是否通过未定义的“函数”左值调用“ noexcept函数”?

  15. 15

    是否将reinterpret_cast的派生类指针转换为基类指针未定义的行为?

  16. 16

    将php函数返回值转换为true / false

  17. 17

    将字符转换为整数并返回值的函数 [C]

  18. 18

    为什么某些函数既通过返回值又通过写入传递的指针来返回结果?

  19. 19

    将int指针转换为void指针并返回以在另一个函数中使用该值?

  20. 20

    破坏可能返回未定义的函数的返回

  21. 21

    自调用函数返回“未定义”

  22. 22

    js函数调用返回未定义

  23. 23

    将(文件读取)函数返回值转换为c_str()行为不符合预期

  24. 24

    函数的参数是未定义的,但我通过所有必需的参数调用它

  25. 25

    匿名函数转换为void返回的委托无法返回值

  26. 26

    即使返回值,异步函数也会返回未定义的

  27. 27

    宏可以通过强制转换为void来模仿void返回函数吗?

  28. 28

    宏可以通过强制转换为void来模拟void返回函数吗?

  29. 29

    C中的void函数指针返回值

热门标签

归档