错误:C中无效表达的使用无效

时间:2012-10-08 16:55:01

标签: c

关于以下函数,我收到“无效使用void表达式”错误:

void remove_data(char* memory, char* bitmap, int pos)
{
    int i;

    i = (int)test_bit(bitmap, pos-1);

    if(i != 0)
    {
        memory[pos-1] = NULL;
        toggle_bit(bitmap, pos-1);
    }
}

现在从我在其他线程上读到的有关此类似问题的内容,当程序员在函数中使用将生成输出的内容时,会弹出此错误。但是,我没有看到在我编写的代码中会导致什么原因。

编辑添加:

其中使用的切换位功能也是void类型,不返回值。

void test_bit(char * bitmap, int pos)
{
    int bit;

    bit = bitmap[pos/8] & (1<<(pos%8));
    printf("%d\n", &bit);
}

我在test_bit中注释了printf行,但错误仍然存​​在。

4 个答案:

答案 0 :(得分:8)

  

但是,我没有看到在我编写的代码中会导致什么原因。

我也是,因为我认为你没有发布相关代码。无论如何,我认为这可能是你的问题:

i = (int)test_bit(bitmap, pos-1);

请告诉我们test_bit的签名。我猜它会返回void,或者你已经向某个地方宣布了它并且不小心写了:

void test_bit(char*, int);

由于函数返回void(即什么都没有),你不能再继续将返回值(没有任何内容)转换为int,这是没有意义的,是非法的

编辑:您已在评论中确认test_bit实际上已宣布退回void,因此这是您的问题。

答案 1 :(得分:0)

由于test_bit无效,您可能无法使用其返回(如i = (int)test_bit(bitmap, pos-1);中所述) - 没有返回值。

答案 2 :(得分:0)

你写了

 i = (int)test_bit(bitmap, pos-1);

为什么要演员?

当函数

时似乎有点愚蠢
void test_bit(char * bitmap, int pos)
{
    int bit;

    bit = bitmap[pos/8] & (1<<(pos%8));
    printf("%d\n", &bit);
}

你怎么能将void转换为整数?

答案 3 :(得分:0)

显而易见解决方案:请勿分配函数返回void的结果。

非显而易见解决方案:不要嵌套函数调用,这样的可能性较小 会发现所有错误的地方,并认为编译器已损坏。

#include <stdio.h> //:for: printf(...)

void YOUR_MISTAKE_ACTUALLY_HERE();
void  MyFunc( void );
void* WRAPPED_MyFunc( int, int, int );


int main( void ){
    printf("[BEG:main]\n");


    void* HW = NULL;
    HW = WRAPPED_MyFunc(  //:<---So you check this, but it looks fine.
        1
    ,   YOUR_MISTAKE_ACTUALLY_HERE()
    ,   3
    );; //:<--- compiler says "Invalid Use Of Void Expression" Here.

    if( HW ){ /** NOOP **/ };


    printf("[END:main]\n");
} 

    void YOUR_MISTAKE_ACTUALLY_HERE(){ }

    //:Pretend this function is fetched from DLL.
    //:Casting all DLL functions initially to void(*pfn)void
    //:in a lookup table, then re-casting later.
    void MyFunc( void ){

        return;

    }//[;]//

    typedef  
        void* 
        (* MyFunc_TYPEDEF)(            

            int a
        ,   int b
        ,   int c

        );

    void*
    WRAPPED_MyFunc(

        int a
    ,   int b
    ,   int c

    ){


               MyFunc_TYPEDEF
        fun =( MyFunc_TYPEDEF)
               MyFunc;

        void* ret=( fun(

            a
        ,   b
        ,   c

        ));

        return( 
            (void*)
            ret 
        );;

    }//:Func