1

所以我需要从 C 中的一些变量中删除常量(我知道我在做什么)。所以我写了一个小宏 ( 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);
}

编译和执行

$ 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

有没有办法优化我的宏,所以这个警告不会出现?

4

2 回答 2

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;

像这种操作一样繁琐。

于 2012-11-15T21:10:00.503 回答
0

如果 string1 应该是一个 const 指针(而不是一个指向 const 数据的非 const 指针),那么这样写:

char * const ptr = "foo";

或者

const char * const ptr = "foo";

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

于 2012-11-15T21:14:37.570 回答