奇怪的指针强制转换问题:void *

4
我们正在进行关于嵌入式Linux和C和C++的项目。最近在一个函数中遇到了一个奇怪的语句:
bool StrangeFunction(void* arg1, void* arg2, void* arg3)
{
    (void)arg1;
    (void)arg2;
    (void)arg3;

    unsigned long keycode = (unsigned long)arg2;

    switch(keycode)
    {
...

以上代码中有两个问题:

  1. (void)arg1;是什么意思?
  2. 是否可以并且是否适合使用unsigned long keycode = (unsigned long)arg2;

如果您不介意的话,我需要一些解释和相关链接来解释这些问题。谢谢。

3个回答

10
  1. 这是为了消除编译器关于未使用参数的警告。

  2. 这种方法可能可行,但不具备可移植性。如果在特定平台上,一个地址适合于 unsigned long,那么它就可以使用。在支持uintptr_t的平台上使用该类型可以使代码具有可移植性。


在GCC 4.8.2中,为什么第二行会出现关于“[-fpermissive]”的错误?因为根据我的理解,一个类型是指针,而另一个类型则不是指针。或者我有什么地方理解上出了问题吗? - Fredrick Gauss
@FredrickGauss:根据GCC文档(https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Option-Summary.html),`-fpermissive`是C++选项。我不知道C ++。抱歉。 - undur_gongor

2
void 转换的目的主要是为了消除编译器对未使用变量的警告信息,参见抑制C/C++中未使用参数编译器警告
如果可能的话,应该使用 uintptr_t 代替 unsigned long,它是一种无符号整数类型,能够容纳指针。我们可以从C99标准草案第7.18.1.4能够容纳对象指针的整数类型 中看到这一点,其中写道:

以下类型指定了一种无符号整数类型,该类型具有以下特性:任何有效的指向 void 的指针都可以转换为此类型,然后再转换回指向 void 的指针,结果将与原始指针相等:

uintptr_t


0

(void)arg1 什么也不做,但是让编译器使用变量。这是一种具有参数但未使用任何“参数未使用”编译器警告的函数的方法。

第二个问题是当将无符号长整型传递到需要 void * 的函数中时使用。如果您已经处理了 C++,最好使用重载函数。这也有一个缺点,即要求指针至少与 unsigned long 一样大,因此它可能无法在某些平台上工作。


谢谢你。对于我的第二个案例,我们只对 C 感兴趣,即使是 C++,我们也不能使用其他的重载函数。 - Fredrick Gauss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接