相关疑难解决方法(0)

为什么此声明取消引用编译器特定的类型标记指针警告?

我已经阅读 有关Stack Overflow RE的各种文章 :取消引用类型标记的指针错误。我的理解是,该错误本质上是编译器警告,它警告通过不同类型的指针访问对象的危险(尽管似乎为产生了例外),这是可以理解且合理的警告。 char*

我的问题特定于以下代码:为什么将指针的地址强制转换void**为此警告的合格字符(通过导致错误-Werror)?

而且,此代码针对多个目标体系结构进行了编译,只有其中一种会生成警告/错误-这是否暗示它合法地是特定于编译器版本的缺陷?

// main.c
#include <stdlib.h>

typedef struct Foo
{
  int i;
} Foo;

void freeFunc( void** obj )
{
  if ( obj && * obj )
  {
    free( *obj );
    *obj = NULL;
  }
}

int main( int argc, char* argv[] )
{
  Foo* f = calloc( 1, sizeof( Foo ) );
  freeFunc( (void**)(&f) );

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果上述我的理解是正确的,a void**仍然只是一个指针,这应该是安全的。

没有不使用左值来解决此编译器特定警告/错误的解决方法?也就是说,我理解这以及为什么这可以解决问题,但是我想避免这种方法,因为我想利用 …

c pointers casting

34
推荐指数
3
解决办法
2342
查看次数

使用GCC和clang __attribute __((cleanup))和指针声明的一种好的惯用方法

我认为GCC扩展__attribute__((cleanup))是一个好主意,至少在某些情况下,但我无法弄清楚如何以一种好的方式使用它.我所做的一切看起来仍然很烦人.

我看到了很多的代码做#define _cleanup_(x) __attribute__((cleanup(x))只是为了少打字,但它有没有办法通过有没有一个标准功能一样free或者closedir,fclose等?

我看到我不能写:

__attribute__((cleanup(free))) char *foo = malloc(10);
Run Code Online (Sandbox Code Playgroud)

因为清理回调会收到char**指针,所以我必须总是这样写:

static void free_char(char **ptr) { free(*ptr); }
__cleanup__((free_char)) char *foo = malloc(10);
Run Code Online (Sandbox Code Playgroud)

这非常烦人,最烦人的部分是为你需要的所有类型定义这样的清理函数,因为显然你不能只为它定义它void **.避免这些事情的最佳方法是什么?

c gcc clang

18
推荐指数
2
解决办法
3518
查看次数

双指针转换,使用`const void**ptr`参数传递给函数

海湾合作委员会给了我以下警告:

note: expected 'const void **' but argument is of type 'const struct auth **
Run Code Online (Sandbox Code Playgroud)

有没有可能导致问题的情况?

更大的片段是

struct auth *current;
gl_list_iterator_next(&it, &current, NULL);
Run Code Online (Sandbox Code Playgroud)

函数只存储在current一些void *指针中.

c gcc pointers

5
推荐指数
1
解决办法
1176
查看次数

标签 统计

c ×3

gcc ×2

pointers ×2

casting ×1

clang ×1