这可能会澄清它(从此处开始):
(更新:我没有包含完全相同的链接是表露无疑我错过了在原来的问题的链接。:P)
/* The rather clumsy cast above is necessary because the ISO C standard
does not require that pointers to functions can be cast back and
forth to 'void *'. (See TLPI pages 863-864.) SUSv3 TC1 and SUSv4
accept the ISO C requirement and propose casts of the above
form as the workaround. However, the 2013 Technical Corrigendum
(TC1) to SUSv4 requires casts of the following more natural form
to work correctly:
funcp = (void (*)()) dlsym(libHandle, argv[2]);
Various current compilers (e.g., gcc with the '-pedantic' flag)
may still complain about such casts, however. */
从本质上讲,这是一种避免不得不将void*
fromdlsym()
强制转换为函数指针的方法,而是将数据重新解释funcp
为avoid*
并将其存储在其中。这是通过采取的地址来实现的funcp
(变量本身的地址),假装的地址指的是void*
(通过(void**)
铸造),解除引用它,并存储void*
从dlsym()
进去。更简单的形式也可能在实践中起作用。
通过获取数据地址,将该地址转换为指向不同类型的指针并取消引用的这种“重新解释”数据的方法通常被称为类型整理。该双关语来自于不同的方式,这是真正的双关语是如何工作太解释当具有不同的含义相同的数据。
(类型修剪在某些情况下可能是不安全的,包括当编译器使用严格的别名规则时,它可以假设不同类型的某些指针没有别名(它们没有引用相同的数据)。上面的转换可能在您获得函数指针和void*
引用相同数据时违反了严格的别名,尽管在这种情况下这是“可能在实践中起作用的东西。”
(ISO C不需要将函数指针安全地转换为void
指针并返回的原因可能是函数和数据(void
指针指向“数据”)分别存储在某些计算机上。由于它们是分开的,因此它们也可能使用不同的名称。地址长度或格式,以免在函数指针和数据指针之间进行强制转换。以这种方式分隔代码和数据的体系结构称为哈佛体系结构。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句