c++ - 如何定义全局函数指针并分配给特定地址

标签 c++ c function pointers function-pointers

这对有经验的 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:找到一个或多个多重定义的符号 我认为发生这种情况是因为我包含了来自多个源文件的头文件。我用 const 关键字做到了。但令我困扰的是,在 const 之前,我尝试了 #pragma once 和这样的 include guard:

#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

源文件是单独编译的,如果你在一个头文件中定义对象,将这个头文件包含在多个源文件中,然后全部编译,你会在每个编译文件中得到这些对象的定义。尝试将它们链接在一起会让您从任何链接器中得到多重定义错误。

对于像这样简单的常量,你可能会逃脱

#define get_game_obj2 ((int *(*)())0x401870)

简单地声明内联转换。

这种代码作为一种学习工具很有趣,如果您正在编写每一位都非常宝贵的微 Controller 代码,那么这种代码很有用,但工作量、复杂性和脆弱性都是真正的开销。你不对他们负责,但是无论你对这段代码负责的人都应该有具体的,而不是抽象的,不是手摇的,具体的,以这种方式这样做的理由。如“如果我们不这样做,我们就有代码不适合 eeprom 的风险”或“如果我们不这样做,您永远不会围绕 C 类型语法”。

关于c++ - 如何定义全局函数指针并分配给特定地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59004506/

相关文章:

C++从文本文件中删除尾随的新行

c - 通过子叉内的指针增加变量值

c - 长整数中单个位的索引(在 C 中)

function - os.O_TRUNC 的作用是什么?

JQuery - 通过合并函数来简化脚本?

c++ - 从 const string 到 bool 的隐式转换

c++ - MPI_DOUBLE_INT 和 C++ 结构

c++ - Koenig 查找的基本原理

c - getch 已弃用

excel - 在 Excel 的同一工作簿中将数据从工作表 1 复制到工作表 2