reinterpret_cast 为 void* 不适用于函数指针

2023-11-24

我想将函数指针重新解释为 void* 变量。函数指针的类型将是Class* (*)(void*).

下面是示例代码,

class Test
{
    int a;
};

int main()
{
    Test* *p(void **a);
    void *f=reinterpret_cast<void*>(p);     
}

上面的代码适用于 Visual Studio/x86 编译器。但使用ARM编译器时,会出现编译错误。不知道为什么。

错误:#694:reinterpret_cast 不能 抛弃 const 或其他类型 预选赛

我读了解释将函数指针转换为另一种类型

我对下面的解释感到担心。

函数指针和之间的转换 常规指针(例如,强制转换void (*)(void) to a void*)。功能 指针不一定相同 大小与常规指针一样,从那时起 它们可能包含一些架构 额外的上下文信息。这 在 x86 上可能可以正常工作,但是 请记住,这是未定义的行为。

如何进行此类转换void (*)(void*) -> void*有效,至少它在大多数编译器中编译得几乎相同?


reinterpret_cast不能用于将函数指针强制转换为void*。虽然 C 类型转换还可以执行一些静态、重新解释和 const 类型转换的组合所不允许的其他操作,但该转换并不是其中之一。

在 C 中,允许强制转换,但未定义其行为(即,即使往返也不能保证有效)。

一些 POSIX 函数需要转换才能发挥作用。

我在这里使用过几个编译器:

  • 即使在最高一致性模式下,也不会阻止 C 转换。有些根据警告和一致性级别发出警告,而另一些则无论我尝试什么都没有发出警告。
  • 即使在更宽松的级别,reinterpret_cast 对某些编译器来说也是一个错误,而其他编译器在所有情况下都接受它而没有发出警告。

在 C++0X 的最新可用草案中,reinterpret_cast有条件地支持函数指针和对象指针之间的转换。

请注意,这是否有意义将更多地取决于目标而不是编译器:像 gcc 这样的可移植编译器将具有由目标体系结构和可能的 ABI 强加的行为。

正如其他人所说,

Test* *p(void **a);

定义一个函数,而不是指向函数的指针。但是函数到函数指针的隐式转换是针对reinterpret_cast的参数进行的,所以reinterpret_cast得到的是Test** (*p)(void** a).

感谢 Richard,它让我更深入地重新审视这个问题(郑重声明,我错误地认为函数指针到对象指针是 C 类型转换允许未经 C++ 类型转换组合授权的内容的一种情况)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

reinterpret_cast 为 void* 不适用于函数指针 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 如何验证日期?

    我正在尝试测试以确保日期有效 因为如果有人输入2 30 2011那么应该是错误的 我怎样才能对任何日期执行此操作 验证日期字符串的一种简单方法是转换为日期对象并进行测试 例如 Expect input as d m y function i
  • 为什么mysql max_allowed_pa​​cket自动重置为1m

    I set SET GLOBAL max allowed packet 16777216 并且 mysqld max allowed packet 16M 我通过下面的命令检查了 max allowed pa cket SHOW VARIA
  • 持久保存到 Azure 表存储时使用 POCO

    我计划在我的 ASP NET 5 MVC 6 应用程序中使用 Azure 表存储 并添加了WindowsAzure StorageNuGet 包 但当我注意到我所有的 entnty 模型都需要继承时 我真的很失望Microsoft Wind
  • Laravel Dusk - 类配置不存在

    最近将 5 3 项目升级到 5 4 一切看起来都不错 今天我开始实现 Dusk 但是在运行示例测试时遇到了问题 footy finance 5 4 php artisan dusk PHPUnit 6 0 0 by Sebastian Be
  • ggplot2 版本 0.9.3.1 不会加载到 R 3.0.2 中

    我不小心删除了旧版本的ggplot2 所以我下载了新版本 当我使用时 library ggplot2 我收到以下错误 Error in loadNamespace i c lib loc libPaths versionCheck vI i
  • 减少 Java 8 中的一元运算符列表

    在 Java 8 中减少 UnaryOperators 列表直到它们代表一个我可以调用 apply 的 UnaryOperator 的首选方法是什么 例如我有以下内容 interface MyFilter extends UnaryOper
  • 文件扩展名 .DB - 它到底是什么类型的数据库?

    我有一个带有 DB 文件扩展名的数据库文件 我一直在谷歌上搜索 它看起来像 SQLite 我尝试使用 SQLite 和 SQLite3 驱动程序连接到它 但收到错误 文件已加密或不是数据库 所以我不知道文件是否已加密或者它不是 SQLite
  • CSS:两个 50% 流体列不考虑最小宽度

    我正在尝试使用this用两个 50 列宽代替的布局 但似乎当右列达到其 最小宽度 时 它会进入左列下方 有没有办法使用 垫片 技术来设置包装器的最小宽度 以便两列都停止调整大小 因此 消除了右列发现自己位于左列下方的问题 我的页面如下 di
  • 如何在 Perl 中设置文件读取缓冲区大小以针对大文件进行优化?

    我知道 Java 和 Perl 在读取文件时都非常努力地寻找一种适合所有默认缓冲区大小的方法 但我发现它们的选择越来越过时 并且在更改默认选择时遇到问题珀尔 以 Perl 为例 我相信它使用8K默认情况下的缓冲区 类似于Java的选择 我无
  • printf() 的执行和分段错误

    include
  • 检索和修改 XMLHttpRequest 的内容

    我正在为 Firefox Safari Chrome 开发一个浏览器插件 它将拦截页面上的数据 针对正则表达式运行它 然后如果匹配 则重新格式化它 我使用以下方法在页面加载上进行此操作 var meth replaceInElement f
  • 调用未定义的函数 pg_connect() - Wamp

    我想连接到 PostgreSQL 我使用 wamp 64 位 我这里有 阿帕奇2 4 2 PHP 5 4 3 mysql 5 5 24 我还在 php ini 中取消注释 php pgsql 和 php pdo pgsql 但我无法连接 它
  • C# 验证电子邮件地址是否存在

    关于这个帖子关于电子邮件验证 使用 C 你会怎样 发出 VRFY 命令 发出 RCPT 命令 我想您会发现 在很多情况下 这些功能会故意对您撒谎 以击败垃圾邮件发送者 如果有一种方法可以确认电子邮件的真实性 而不是让用户点击验证 或取消订阅
  • atoi 是一个标准函数。但伊托亚不是。为什么?

    为什么会有这样的区别 我遇到了可怕的问题 假设itoa将在stdlib h最后链接了一个自定义版本itoa使用不同的原型 从而产生一些疯狂的错误 那么 为什么不是itoa不是标准函数 它出什么问题了 为什么标准偏向它的孪生兄弟atoi No
  • 为什么对 sysfs 设备属性文件上的“poll”调用没有正确阻止?

    我有一个简单的sysfs 设备属性它显示在我的下面sysfs目录 并调用read返回内核空间变量的值 我想打电话poll在此属性上允许我的用户空间线程阻塞 直到属性显示的值发生变化 我的问题是poll似乎并没有阻止我的属性 它不断返回POL
  • Angular 2:ngFor 完成时回调

    在 Angular 1 中 我编写了一个自定义指令 repeater ready 来使用ng repeat当迭代完成时调用回调方法 if scope last true timeout gt scope parent parent eval
  • 成员函数的部分特化[重复]

    这个问题在这里已经有答案了 可能的重复 部分模板专业化的 无效使用不完整类型 错误 为什么我可以这样做 template
  • Azure WebJobs SDK ServiceBus 连接字符串“AzureWebJobsAzureSBConnection”丢失或为空

    我在 Visual Studio 2015 中创建了一个 Azure Function App 该应用程序具有服务总线队列的触发器 当我在本地运行该应用程序时 它运行得很好 它能够从服务总线队列 通过名为 AzureSBConnection
  • Firebase 推送通知在 iOS 13 上不起作用

    Firebase 推送通知无法在 iOS 13 上运行 但在 iOS 12 4 中运行良好 有什么解决办法吗 编辑 2019 年 10 月 4 日 静默推送通知在 iOS 13 上不起作用 快速修复解决方案 如果您在 iOS 版本 13 2
  • reinterpret_cast 为 void* 不适用于函数指针

    我想将函数指针重新解释为 void 变量 函数指针的类型将是Class void 下面是示例代码 class Test int a int main Test p void a void f reinterpret cast