所以我需要从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
有没有办法优化我的宏,所以这个警告不显示?
答案 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宏会按预期工作。