如何定义全局函数指针并分配给特定地址
How to define a global func pointer and assign to a specific address
这对有经验的 C 程序员来说应该是显而易见的,但对我来说不是。
我的情况:我有一个函数的常量地址。我想定义一个符号,分配给地址并能够像函数一样调用它。我希望这个函数在一个单独的头文件中,这样我就可以在任何需要这个函数的地方包含它。
到目前为止我做了什么:
// utils.h
#pragma once
typedef int* (*funptr)();
const funptr get_game_obj2 = (funptr2)0x00401870;
此代码按预期工作。但。我试图找出如何在没有 typedef 的情况下实现相同的目标。
我尝试了类型和括号的不同组合,但没有任何效果。我有一种强烈的感觉,它应该是可行的,但找不到任何对 google 的引用。
const int* (*get_game_obj2)() = (int* (*)())0x00401870;
(int* (*)()) get_game_obj2 = (int* (*)())0x00401870;
int* (*)() get_game_obj2 = (int* (*)())0x00401870;
const( int* (*get_game_obj2)()) = 0x00401870;
顺便说一句,之前我 运行 遇到一个问题,工作代码编译了两次,我遇到了重定义编译错误。
fatal error LNK1169: one or more multiply defined symbols found
我认为发生这种情况是因为我包含了来自多个源文件的头文件。我用 const
关键字做到了。但令我困扰的是,在 const
之前,我尝试了 #pragma once
和这样的包含防护:
#pragma once
#ifndef GRANDPARENT_H
#define GRANDPARENT_H
typedef int* (*funptr)();
funptr get_game_obj2 = (funptr2)0x00401870;
#endif /* !GRANDPARENT_H */
我的期望是有了这样的保护,这个文件在编译期间应该只执行一次,所以不会发生重新定义。为什么这不起作用,但 const
起作用了?
谢谢
你们太亲密了。
typedef 上的 const
适用于它的顶层类型,因为 int *(*)()
那是指向函数的指针,所以 const funptr
得到你 int *(*const)()
,一个常数-指向函数的指针。
int *(*const get_game_obj2)() = (int *(*)())0x401870;
编辑:
I include the header file from multiple source files. I managed that with const keyword. But what bothers me is the fact, that before const I tried #pragma once and an include guard
源文件是单独编译的,如果你在一个头文件中定义对象,将这个头文件包含在多个源文件中,然后全部编译,你会在每个编译文件中得到这些对象的定义。尝试 link 将它们放在一起会让你从任何 linker.
中得到多重定义错误
对于像这样简单的常量,您可能可以不用
#define get_game_obj2 ((int *(*)())0x401870)
简单地声明内联转换。
这种代码作为一种学习工具很有趣,如果您正在编写每一位都很宝贵的微控制器代码,那么这种代码很有用,但努力、复杂性和脆弱性是真正的代价。你不对他们负责,但是无论你对这段代码负责的人都应该有具体的,而不是抽象的,不是手摇的,具体的,以这种方式这样做的理由。如 "if we don't do it this way we risk the code not fitting in the eeprom" 或 "if we don't do it this way you never wrap your head around C type syntax".
这对有经验的 C 程序员来说应该是显而易见的,但对我来说不是。 我的情况:我有一个函数的常量地址。我想定义一个符号,分配给地址并能够像函数一样调用它。我希望这个函数在一个单独的头文件中,这样我就可以在任何需要这个函数的地方包含它。
到目前为止我做了什么:
// utils.h
#pragma once
typedef int* (*funptr)();
const funptr get_game_obj2 = (funptr2)0x00401870;
此代码按预期工作。但。我试图找出如何在没有 typedef 的情况下实现相同的目标。 我尝试了类型和括号的不同组合,但没有任何效果。我有一种强烈的感觉,它应该是可行的,但找不到任何对 google 的引用。
const int* (*get_game_obj2)() = (int* (*)())0x00401870;
(int* (*)()) get_game_obj2 = (int* (*)())0x00401870;
int* (*)() get_game_obj2 = (int* (*)())0x00401870;
const( int* (*get_game_obj2)()) = 0x00401870;
顺便说一句,之前我 运行 遇到一个问题,工作代码编译了两次,我遇到了重定义编译错误。
fatal error LNK1169: one or more multiply defined symbols found
我认为发生这种情况是因为我包含了来自多个源文件的头文件。我用 const
关键字做到了。但令我困扰的是,在 const
之前,我尝试了 #pragma once
和这样的包含防护:
#pragma once
#ifndef GRANDPARENT_H
#define GRANDPARENT_H
typedef int* (*funptr)();
funptr get_game_obj2 = (funptr2)0x00401870;
#endif /* !GRANDPARENT_H */
我的期望是有了这样的保护,这个文件在编译期间应该只执行一次,所以不会发生重新定义。为什么这不起作用,但 const
起作用了?
谢谢
你们太亲密了。
typedef 上的const
适用于它的顶层类型,因为 int *(*)()
那是指向函数的指针,所以 const funptr
得到你 int *(*const)()
,一个常数-指向函数的指针。
int *(*const get_game_obj2)() = (int *(*)())0x401870;
编辑:
I include the header file from multiple source files. I managed that with const keyword. But what bothers me is the fact, that before const I tried #pragma once and an include guard
源文件是单独编译的,如果你在一个头文件中定义对象,将这个头文件包含在多个源文件中,然后全部编译,你会在每个编译文件中得到这些对象的定义。尝试 link 将它们放在一起会让你从任何 linker.
中得到多重定义错误对于像这样简单的常量,您可能可以不用
#define get_game_obj2 ((int *(*)())0x401870)
简单地声明内联转换。
这种代码作为一种学习工具很有趣,如果您正在编写每一位都很宝贵的微控制器代码,那么这种代码很有用,但努力、复杂性和脆弱性是真正的代价。你不对他们负责,但是无论你对这段代码负责的人都应该有具体的,而不是抽象的,不是手摇的,具体的,以这种方式这样做的理由。如 "if we don't do it this way we risk the code not fitting in the eeprom" 或 "if we don't do it this way you never wrap your head around C type syntax".