Tag: 无效

什么时候可以使用“void()”,这样做有什么好处

我最近开始学习C语言,并且已经注意到函数“void()”,但是,我想知道它的作用,它是最好的应用点,也许是void的替代品,可能更有效率。 谢谢。

使用(显然)空Cfunction

任何人都可以对以下function的观点发表评论,这看起来并不是很多: // Returns stored values int getDetails(const int param1[], int* param2, int* param3, int* param4) { (void)param1; (void)param2; (void)param3; (void)param4; return 0; } 评论实际上是代码。 我认为它必须是某种奇怪的存根,但它被调用,我绞尽脑汁试图想象我错过了什么。 到目前为止,我最好的预感是该函数已被弃用但未被删除, (void)param是为了避免编译器警告有关未使用的变量。

两个带有void和空参数列表的函数声明

我想知道为什么以下代码: void foo(void); void foo() { } 在gcc中有效。 在C中,没有重载和上面的声明(实际上,其中一个是定义)声明两个不同的函数(第一个不接受任何参数,第二个可以接受任何参数)类型)。 但是,如果我们为第一个函数提供定义: void foo(void) { } void foo() { } 由于重新定义,此次编译失败。 但是 ,第一个代码仍然是正确的,可能会令人困惑,如下所示: void foo(void); int main(void) { foo(); //OK //foo(5); //Wrong, despite ->the definition<- allows it } void foo() { } 另一方面,这样的事情是无效的: void foo(int); void foo() //error: number of arguments doesn’t match prototype { } 我认为与我的第一个前面的代码相比,编译器的行为有点奇怪。 […]

void **是ANSI-C中可接受的类型吗?

我见过一个函数,其原型是: int myfunc(void** ppt) 该函数在C文件中作为a = myfunc(mystruct ** var1)调用; 其中mystruct是我们拥有的结构之一的typedef。 这在MSVC6.0中没有任何编译错误,但是当我用其他一些C编译器编译它时,它会在调用此函数的地方出错,并显示错误消息: mystruct类型的参数**与void **类型的参数不兼容 myfunc()的参数保持为void **,因为它似乎是一个通用的malloc类函数,可以使用各种结构变量类型进行内存分配 在C标准/任何C编译器中是否允许使用任何类型的void **? 我该如何解决? [我尝试将函数调用参数转换为mystruct** ,但它不起作用] -广告

要理解无效指针

在我的回答中,我提到解除引用void指针是一个坏主意。 但是,当我这样做时会发生什么? #include int main (void) { void* c = malloc(4); *c; &c[0]; } 汇编: gcc prog.c -Wall -Wextra prog.c: In function ‘main’: prog.c:4:2: warning: dereferencing ‘void *’ pointer *c; ^~ prog.c:5:4: warning: dereferencing ‘void *’ pointer &c[0]; ^ prog.c:5:2: warning: statement with no effect [-Wunused-value] &c[0]; ^ 这是来自Wandbox的图片,对于那些说它没有发生的人: 和Ideone中的现场演示 。 它实际上会尝试读取c指向的内存,然后获取该结果,但实际上什么都不做? 或者这条线根本没有效果(但GCC不会产生警告)。 我在想,既然编译器对数据类型一无所知,在不知道类型大小的情况下,它将无法做很多事情。 为什么derefencing […]

将0转为无效

在我的C ++实现(Visual Studio 2008实现)中,我在看到以下行 #ifdef NDEBUG #define assert(_Expression) ((void)0) 我不明白需要将0转为void。 在我看来,这 #ifdef NDEBUG #define assert(_Expression) (0) 甚至简单地说 #ifdef NDEBUG #define assert(_Expression) 0 考虑到可以使用assert(expr)的上下文,会这样做。 那么,在这种情况下, int类型为0而不是0类型为0的危险是什么? 任何现实的例子?

x的冲突类型和先前的声明在这里……什么?

当我有时间的时候,我一直在教自己C几个月,我遇到了一个问题,我不知道如何修复。 具体来说,当我尝试使用gcc编译它时,我得到: geometry.c:8:错误:’trapezoid’的冲突类型 geometry.c:7:注意:之前的’trapezoid’声明就在这里 geometry.c:48:错误:’trapezoid’的冲突类型 geometry.c:7:注意:之前的’trapezoid’声明就在这里 geometry.c:119:错误:’trapezoid_area’的冲突类型 geometry.c:59:注意:’trapezoid_area’的先前隐式声明就在这里 geometry.c:在函数’cone_volume’中: geometry.c:128:error:被叫对象’3.14100000000000001421085471520200371742248535156e + 0’不是函数 geometry.c:在函数’cylinder_volume’中: geometry.c:136:错误:被叫对象’3.14100000000000001421085471520200371742248535156e + 0’不是函数 现在,我想我可能需要对这些function进行类型转换,但我不确定。 看起来它想要读取PI,我将其定义为3.141,作为一个函数。 有没有办法可以避免使用魔法数字3.141(虽然它比其他数字少得多)? //Geometric formulae #include #include #define PI 3.141 float trapezoid(float b1, float b2, float h); int trapezoid(); float sphere_volume(float r); int sphere(); float cone_volume(float r, float h); int cone(); float pyramid_volume(float b, float h); int pyramid(); float […]

将void指针强制转换为struct

我开始对C感到舒服,然后遇到了铸造。 如果我在* .h文件中定义了以下内容 struct data { int value; char *label; }; 这是另一个* .h文件 # define TYPE void* 如何将void指针强制转换为struct,以便我可以使用传递给函数的变量“TYPE val”? 例如,如果我想利用TYPE val指向的值,我该如何转换它以便我可以将该值传递给另一个函数?

C编程:将int指针转换为int?

假设我有一个名为ptr的void *。 我应该如何使用ptr来存储int? 写作是否足够 ptr = (void *)5; 如果我想保存5号? 或者我必须使用malloc来保存它?

将void *作为函数调用而不声明函数指针

我已经搜索过但找不到任何结果(我的术语可能已关闭)所以请原谅我,如果之前已经提出过这个问题。 我想知道是否有一种简单的方法可以在没有首先声明函数指针然后为函数指针指定地址的情况下将void*作为C函数调用。 即。 假设要调用的函数是void(void) void *ptr; ptr = ; ((void*())ptr)(); /* call ptr as function here */ 用上面的代码,我得到错误C2066:在VC2008中强制转换为函数类型是非法的 如果可能,具有返回类型和多个参数的函数的语法有何不同?