带空洞的奇怪指针铸造* 我们正在研究C和C++的Embedded Linux项目。 我最近在函数中遇到一个奇怪的语句: bool StrangeFunction(void* arg1, void* arg2, void* arg3) { (void)arg1; (void)arg2; (void)arg3; unsigned long keycode = (unsigned long)arg2; switch(keycode) { ...

带空洞的奇怪指针铸造* 我们正在研究C和C++的Embedded Linux项目。 我最近在函数中遇到一个奇怪的语句: bool StrangeFunction(void* arg1, void* arg2, void* arg3) { (void)arg1; (void)arg2; (void)arg3; unsigned long keycode = (unsigned long)arg2; switch(keycode) { ...,c,casting,void-pointers,C,Casting,Void Pointers,我在上面的代码中有两个问题 (void)arg1是什么意思 是否可以并且可以使用unsigned long keycode=(unsigned long)arg2 如果你不介意,我需要一些解释和相关链接来解释主题。 谢谢 这是为了消除有关未使用参数的编译器警告 这是可能的,但不便于携带。如果在给定的平台上,一个地址适合无符号long,就可以了。在可用于使此代码可移植的平台上使用 (void)arg1不执行任何操作,但使编译器使用该变量。这是一种使函数接受未使用的参数,但避免任何“参数未使用”编译

我在上面的代码中有两个问题

  • (void)arg1是什么意思
  • 是否可以并且可以使用
    unsigned long keycode=(unsigned long)arg2
  • 如果你不介意,我需要一些解释和相关链接来解释主题。 谢谢

  • 这是为了消除有关未使用参数的编译器警告

  • 这是可能的,但不便于携带。如果在给定的平台上,一个地址适合
    无符号long
    ,就可以了。在可用于使此代码可移植的平台上使用

  • (void)arg1
    不执行任何操作,但使编译器使用该变量。这是一种使函数接受未使用的参数,但避免任何“参数未使用”编译器警告的方法


    第二件事是在将无符号long传递给函数时使用,
    void*
    。如果你正在处理C++,最好有一个重载函数。这也有一个缺点,即要求指针至少与
    无符号长
    一样大,因此它可能无法在某些平台上工作。

    转换为
    无效
    很可能用于消除编译器发出的有关未使用变量的警告,请参阅:

    如果可能的话,您应该使用
    uintpttr\u t
    而不是无符号long,这是一种能够容纳指针的无符号整数类型。我们可以从C99标准草案的
    7.18.1.4
    Integer-types部分中看到,Integer-types能够容纳对象指针,其中说明:

    以下类型使用 属性,任何指向void的有效指针都可以转换为此类型, 然后转换回指向void的指针,并比较结果 等于原始指针:

    uintptr\t


    在GCC 4.8.2中,为什么第二行给出关于
    [-fppermissive]
    的错误?因为据我所知,一种是指针,另一种不是指针。还是我错过了什么?”弗雷德里克高斯:根据GCC文档(),<代码> -fimisty< /Cord>是C++选项。我不知道C++。对不起,也谢谢你。对于我的第二个例子,我们只对
    C
    感兴趣,即使
    C++
    ,我们也不能使用另一个重载函数。