关于以下函数,我收到“无效使用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行,但错误仍然存在。
答案 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