删除C中结构中指针的常量

时间:2012-11-15 21:04:57

标签: c pointers gcc macros const

所以我需要从C中的某些变量中删除constness(我知道我在做什么)。所以我写了一个小宏(UNCONST),它允许我为const值赋一个新值。这适用于int等类型的常规变量。但这不适用于指针。所以我不能让指针指向不同的位置使用我的宏UNCONST而不会收到编译器警告。

这里有一个小测试程序unconst.c

#include <stdio.h>

#define UNCONST(type, var, assign) do { \
  type* ptr = (type*)&(var); \
  *ptr = (assign); \
} while(0)

struct mystruct {
  int value;
  char *buffer;
};

int main() {
  // this works just fine when we have an int
  const struct mystruct structure;
  UNCONST(int, structure.value, 6);
  printf("structure.value = %i\n", structure.value);

  // but it doesn't when we have an char *
  char *string = "string";
  UNCONST(char *, structure.buffer, string);
  printf("structure.buffer = %s\n", structure.buffer);

  // this doesn't work either, because whole struct is const, not the pointer.
  structure.buffer = string;
  printf("structure.buffer = %s\n", structure.buffer);
}

编译&amp;执行

$ LANG=en gcc -o unconst unconst.c
unconst.c: In function ‘main’:
unconst.c:21:3: warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]
unconst.c:25:3: error: assignment of member ‘buffer’ in read-only object

有没有办法优化我的宏,所以这个警告不显示?

2 个答案:

答案 0 :(得分:4)

问题在于:

const char *string1 = "string1";
UNCONST(char *, string1, string2);

string1不是真正的const,它可以分配给,但指向一个const字符数组。

实际上,做:

string1 = string2;

编译得很好。

其他的是如果你想复制数组。然后我会写你的宏:

#define UNCONST(type, var) (*(type*)&(var))

所以:

UNCONST(int, i) = 42;

要复制字符数组,您可以这样做:

strcpy(UNCONST(char**,string1), string2);

脚注:实际上我发现这个宏相当无用:我找到了:

*(int*)&i = 42;
这种操作应该是麻烦的。

答案 1 :(得分:0)

如果string1应该是一个const指针(而不是一个指向const数据的非const指针),请按如下方式编写:

char * const ptr = "foo";

const char * const ptr = "foo";

也许(我还没有测试过)如果你正确地声明你的指针,你的UCONST宏会按预期工作。