删除C中结构中指针的常量
所以我需要删除C中一些变量的常量(我知道我在做什么)。因此,我编写了一个小宏(删除C中结构中指针的常量,c,pointers,gcc,macros,constants,C,Pointers,Gcc,Macros,Constants,所以我需要删除C中一些变量的常量(我知道我在做什么)。因此,我编写了一个小宏(uncont),它允许我为常量值指定一个新值。这对于类型为int的普通变量非常有效。但这对指针不起作用。因此,如果不得到编译器警告,我就不能让指针使用我的宏UNCONST指向不同的位置 这里有一个小测试程序unconst.c: #include <stdio.h> #define UNCONST(type, var, assign) do { \ type* ptr = (type*)&(va
uncont
),它允许我为常量值指定一个新值。这对于类型为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);
}
有没有办法优化我的宏以避免出现此警告?问题在于:
const char *string1 = "string1";
UNCONST(char *, string1, string2);
就是string1
实际上不是常量,它可以分配给,但指向常量字符数组
实际上,做:
string1 = string2;
编译得很好
另一件事是,如果要复制数组。然后我将您的宏写为:
#define UNCONST(type, var) (*(type*)&(var))
因此:
UNCONST(int, i) = 42;
要复制字符数组,可以执行以下操作:
strcpy(UNCONST(char**,string1), string2);
脚注:实际上我觉得这个宏很没用:我发现:
*(int*)&i = 42;
这种操作应该很麻烦。问题在于:
const char *string1 = "string1";
UNCONST(char *, string1, string2);
就是string1
实际上不是常量,它可以分配给,但指向常量字符数组
实际上,做:
string1 = string2;
编译得很好
另一件事是,如果要复制数组。然后我将您的宏写为:
#define UNCONST(type, var) (*(type*)&(var))
因此:
UNCONST(int, i) = 42;
要复制字符数组,可以执行以下操作:
strcpy(UNCONST(char**,string1), string2);
脚注:实际上我觉得这个宏很没用:我发现:
*(int*)&i = 42;
这种操作应该很麻烦。如果string1应该是一个常量指针(而不是指向常量数据的非常量指针),请这样编写:
char * const ptr = "foo";
或
如果正确声明指针,可能(我还没有测试过)您的UCONST宏会像您预期的那样工作。如果string1应该是常量指针(而不是指向常量数据的非常量指针),请按如下方式编写:
char * const ptr = "foo";
或
如果您正确声明了指针,您的UCONST宏可能(我没有测试过)会像您预期的那样工作。您知道您可以只编写string1=string2吗?@Kylo我没有,但似乎我太简化了我的代码,我需要编辑问题。使用
int
的第一段调用未定义的行为。编译器可能会合法地将i
放在只读内存中,然后可能会出现崩溃或其他意外结果(如printf()
printing 5而不是6)。您依赖于您的实现的一个特性。所以,当您切换平台或编译器时,可能会出现问题。my 2c:如果您经常需要“取消约束”,然后规划该宏。。。难道其他地方没有什么奇怪的东西吗?堆栈溢出经验法则#4:OP说“我知道我在做什么”,他们不知道。你意识到你可以只写string1=string2吗?@Kylo我没有,但似乎我太简化了我的代码,我需要编辑这个问题。使用int
的第一部分调用未定义的行为。编译器可能会合法地将i
放在只读内存中,然后可能会出现崩溃或其他意外结果(如printf()
printing 5而不是6)。您依赖于您的实现的一个特性。所以,当您切换平台或编译器时,可能会出现问题。my 2c:如果您经常需要“取消约束”,然后规划该宏。。。难道其他地方没有什么奇怪的东西吗?堆栈溢出经验法则#4:OP说“我知道我在做什么”,他们不知道。回答很好,但我使用了一个代码示例,该示例简化了很多。所以我编辑了这个问题。char指针实际上位于const结构的内部
FreeBSD使用这个宏:#define u DECONST(type,var)((type)(uintpttr_t)(const void*)(var))
回答得不错,但我使用了一个简化了很多的代码示例。所以我编辑了这个问题。char指针实际上位于const结构的内部
FreeBSD使用以下宏:#define(type,var)((type)(uintpttr_t)(const void*)(var))