gpt4 book ai didi

c++ - 动态链接库(dll/so)中char*类型的函数参数

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:35 25 4
gpt4 key购买 nike

我编译了一个供应商特定的 OpenGL header ,旨在与硬件特定的静态库一起编译,但我链接并运行了 nVidia Quadro 4000 卡和库 (linux)。这就是我们的供应商所说的我们应该在主机环境中执行此操作的方式,因此无需担心。

虽然我发现了一些奇怪的东西。供应商特定的 header 将 GLchar 类型定义为“unsigned char”(唉......),而 nVidia header 将其类型定义为“char”。这些类型不一样,但它仍然“有效”。我无法将 char* 隐式转换为 unsigned char*,这会给我一个编译错误,但我可以链接并成功运行可能使用“char”原型(prototype)构建的函数 (glGetUniformLocation) 库。

发生了什么事?运行时是否通过确定“char”与“unsigned char”“足够接近”来解决它?还是在构建库时将“char”的出现扩展为一种符号或另一种符号?如果是这样,如果我重载具有所有三种签名的函数会发生什么?

编辑:请注意 OpenGL 库使用 C 链接,它解释了我在接受的答案中描述的特殊经历。

最佳答案

当您使用 C 链接时,函数通过它们的文字名称链接。与名称重整的 C++ 不同,没有任何东西可以控制参数的类型。当您的程序调用函数时,它会将参数放在堆栈或寄存器中(根据调用约定),然后函数读取它。放置指针(4 或 8 个字节),读取指针(相同大小)。调用者将指针解释为 unsigned char*,被调用者将其解释为 char*

如果被调用者读取的字节数多于或少于调用者放置的字节数,堆栈将被破坏,这将导致奇怪的、不需要的行为。

如果被调用者在调用者放置float后读取int,被调用者将处理垃圾数据而不是敏感数据。

关于c++ - 动态链接库(dll/so)中char*类型的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com