41
|
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ · 技术社区 · 15 年前 |
![]() |
1
41
唯一合法的方法是使用字符类型访问组成指针的字节。这样地:
将函数指针作为
组成函数指针的字节实际上是什么 意思是 是否依赖于实现。例如,它们可以将索引表示为一个函数表。 |
![]() |
2
5
使用联合可以绕过警告/错误,但结果仍然(很可能)是未定义的行为:
您可以比较两个函数指针(例如
|
![]() |
3
2
将函数指针强制转换为整数,然后再次强制转换为指针以使用“%p”。
请注意,在某些平台上(例如“中”或“紧凑”内存模型中的16位DOS),指向数据的指针和指向函数的指针的大小不相同。 |
![]() |
4
1
试试这个:
使用了此标志:
没有使用这些标志发出警告 |
![]() |
5
1
使用GCC4.3.4,使用开关-O2-Wstrict别名,Dreamlax的答案将产生:
补充: 我认为反对CAF的回答 迂回性 大小是合理的,他的解决方案没有解决(没有双关语的意图)。达斯汀使用工会演员阵容的建议可能是合法的(尽管从我读到的内容来看,似乎有一些争论,但是 你的 编译器确实比法律重要。但是他的代码可以通过一行代码简化(或模糊化,这取决于您的口味):
这将删除gcc严格别名警告(但它是“正确”的吗?). 如果您正在使用-pedantic开关,或者正在使用sgi irix,则聚合强制转换将无法“工作”,因此您需要使用:
但是关于这个原始问题:它的起源在于-学究式的使用,我认为这有点学究式的。 进一步编辑: 注意您不能使用 主要的 在上一个示例中,如:
当然是因为 &主要的 衰变到 主要的 . |
![]() |
6
0
我不确定这是否是Kosher,但是它在没有循环、联合、强制转换为非指针类型或其他依赖项的情况下实现了效果。
没有警告
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 7 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 8 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 8 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 8 月前 |