奇怪的指针投射与空*

时间:2014-06-23 12:46:57

标签: c casting void-pointers

我们正在开发有关嵌入式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. 如果您不介意,我需要一些解释和相关链接来解释主题。 感谢。

3 个答案:

答案 0 :(得分:10)

  1. 要使有关未使用参数的编译器警告静音。

  2. 有可能但不便携。如果在给定平台上地址适合unsigned long,那就没问题了。在可用的平台上使用uintptr_t可以使此代码可移植。

答案 1 :(得分:2)

转换为void主要用于使编译器对未使用的变量的警告静音,请参阅Suppress unused-parameter compiler warnings in C/C++

如果可能,您应该使用uintptr_t而不是 unsigned long ,即无符号整数类型,能够保存指针。我们可以从草案C99标准部分7.18.1.4 中看到能够保存对象指针的整数类型,其中包含:

  

以下类型指定带有的无符号整数类型   可以将任何有效指向void的指针转换为此类型的属性,   然后转换回指向void的指针,结果将进行比较   等于原始指针:

     

uintptr_t的

答案 2 :(得分:0)

(void)arg1什么都不做,但让编译器使用变量。这是一种获取函数的方法,该函数接受未使用的参数但避免任何"参数未被使用"编译器警告。

将unsigned long传递给带void *的函数时,会使用第二种方法。如果你还在处理C ++,那么拥有一个重载函数可能会更好。这也有一个缺点,就是要求指针至少与unsigned long一样大,因此它可能无法在某些平台上运行。