如何定义全局函数指针并分配给特定地址
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 的情况下实现相同的目标。 我尝试了类型和括号的不同组合,但没有任何效果。我有一种强烈的感觉,它应该是可行的,但找不到任何正确的谷歌参考。
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;
编辑:
源文件是单独编译的,如果在标头中定义对象,将该标头包含在多个源文件中并编译所有源文件,则会在每个编译文件中获得这些对象的定义。尝试将它们链接在一起会从几乎任何链接器中获得多个定义错误。我包含来自多个源文件的头文件。我用 const 关键字管理了它。但让我困扰的是,在 const 之前,我尝试过一次 #pragma 和一个包含后卫
对于像这样简单的事情,你可能会侥幸逃脱
#define get_game_obj2 ((int *(*)())0x401870)
只需内联声明转换。
这种代码作为一种学习设备很有趣,如果你正在编写每一比特都很宝贵的微控制器代码,但工作量、复杂性和脆弱性是真正的开支,那么这种代码很有用。 你不需要对SO负责,但是无论你对谁负责这个代码,都应该有具体的,而不是抽象的,不是挥手的,具体的理由来这样做。 就像"如果我们不这样做,我们就有可能使代码不适合eeprom"或"如果我们不这样做,你永远不会对C类型语法进行思考"。
- 将数组的地址分配给变量并删除
- 将地址分配给本地指针后,公共对象的变量将消失
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- LLVM 传递以在特定地址分配内存
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 给定特定内存地址的数组的动态内存分配
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 获取指针的地址会为其分配一个值
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 如何按顺序或在指定的地址分配内存?
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 是否可以在运行时为宏分配地址
- 为迭代器分配地址
- 如何查找继承类的分配地址
- 如何在 c++ 中为 boost::shared_ptr 分配地址
- 为指针分配地址
- 使用 'memcpy()' 为指针分配地址