Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除C中结构中指针的常量_C_Pointers_Gcc_Macros_Constants - Fatal编程技术网

删除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

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