我编译了供应商特定的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-linkage,它解释了我在接受答案中所描述的特殊经验。

最佳答案

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

如果被调用方读取的字节多于或少于调用方放置的字节,则堆栈将被破坏,这将导致奇怪的不良行为。

如果被叫方在将其放入int之后读取了float,则被叫方将处理垃圾而不是敏感数据。

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

10-09 06:34
查看更多