我需要在地址0xDD2处调用一个函数:
// foo.h
void foo(void) __at(0xDD2);
// foo.c
#include "foo.h"
void foo(void)
{
// some code
}
此代码有效:
#include "foo.h"
void main(void)
{
void (*a)(void) = &foo;
a();
}
但是,这不是:
#include "foo.h"
void main(void)
{
void (*a)(void) = (void (*)(void))(0x0DD2);
a();
}
编译器(XC8)说:main.c:5:: warning: (759) expression generates no code
,调试器在调试时通过这些行。
我需要第二个(仅通过其地址调用函数)。为什么编译器会对其进行优化?指针分配有任何错误吗?更改编译器的优化级别无济于事。
我手头没有XC8编译器,所以我尝试使用CLang模仿某些东西。编译时没有警告,并正确显示In foo
:
#include <stdio.h>
#include <stdint.h>
void foo(void) {
printf("In foo\n");
}
int main() {
intptr_t f = (intptr_t) &foo;
printf("%lx\n", f);
void (*a)(void) = (void (*)(void))f;
(*a)(); // Same behaviour with a();
return 0;
}
我在6.3.2.3语言/转换/其他操作数/指针§5-6中的C11参考手册(n1570草稿中控制)
5整数可以转换为任何指针类型。除先前指定外, 结果是实现定义的...6任何指针类型都可以转换为整数类型。除先前指定外, 结果是实现定义的。...
我的理解是,从纯整数转换为函数指针是合法的,但是实现已定义。您的编译器的兼容级别是多少,是否有任何标志可以控制该行为?