我读过类似指针相等的内容,如果: 它们都指向相同的地址,或者相同的函数。
它可以与名称相同但地址不同的static
函数一起使用吗?
main.c:
#include <stdio.h>
extern void *p1;
extern void *p2;
int main() {
printf("%d\n", p1 == p2);
return 0;
}
啊:
static void f() {}
BC:
#include "A.h"
void *p1 = &f;
抄送:
#include "A.h"
void *p2 = &f;
此代码将打印什么,或者可能是未定义的行为?
最佳答案
代码将具有未定义的行为,但正是因为 C 标准没有指定当指向函数的指针转换为指向 void 的指针时会发生什么
。
将指向函数的指针转换为指向 void
的指针被列为公共(public)扩展 ( C11 J.5.7 ),并且 POSiX 需要它。但是,它可能仍然应该使用显式强制转换。
只有当两个指向函数的指针指向同一个函数 ( C11 6.5.9p6 ) 时,它们才会被比较为相等
Two pointers compare equal if and only [...], both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, [...]
在不同翻译单元中具有内部链接的两个函数是不同的,因此指向它们的指针应该比较不相等;如果保证往返,则同样对它们进行 void *
转换。
我读到的标准是这样的:如果链接器合并具有相同代码的两个定义,则该实现不是一致的。 (C11 6.2.2p2)
关于c - 比较指针与静态变量的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559947/