【发布时间】:2019-11-23 04:22:21
【问题描述】:
这对有经验的 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 起作用了?
谢谢
【问题讨论】:
-
这与函数指针无关。如果该类型是简单的
int,您将遇到多个定义的相同问题。输入extern关键字。 -
1.你的场景对我来说有点奇怪,你确定你的函数所在的地址是固定的吗?这对我来说似乎很容易破碎。 2. 你为什么要避免使用 typedef,它似乎是你的情况的最佳选择,迄今为止最易读
标签: c++ c function pointers function-pointers