[手动分配地址时,编译器优化指向功能的指针

问题描述 投票:3回答:1

我需要在地址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,调试器在调试时通过这些行。

我需要第二个(仅通过其地址调用函数)。为什么编译器会对其进行优化?指针分配有任何错误吗?更改编译器的优化级别无济于事。

c function pointers pic xc8
1个回答
0
投票
应该是一个注释,但其中包含标准的代码和参考。

我手头没有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任何指针类型都可以转换为整数类型。除先前指定外, 结果是实现定义的。...

我的理解是,从纯整数转换为函数指针是合法的,但是实现已定义。您的编译器的兼容级别是多少,是否有任何标志可以控制该行为?

© www.soinside.com 2019 - 2024. All rights reserved.