为什么C允许从常量指针隐式转换到非常量指针

为什么C允许从常量指针隐式转换到非常量指针,c,pointers,casting,constants,implicit,C,Pointers,Casting,Constants,Implicit,以下代码: const char * p; char * i = p; 不在CPP中编译 错误:从“常量字符*”到“字符”的转换无效* 但是,当编译为C代码时,没有编译错误。 为什么C允许将常量指针隐式转换为非常量指针?C有一个未定义行为的概念。它允许它编译程序,即使编译器注意到UB的可能性。在许多情况下,警告被忽略 在这种情况下(gcc) C和C++是两种非常不同的语言,它们有自己的规则和语义(尽管语法有点相似)。常量正确性是它们不同的一个方面。MSVC抱怨:警告C4090:“初

以下代码:

  const char * p;
  char * i = p;
不在CPP中编译

错误:从“常量字符*”到“字符”的转换无效*

但是,当编译为C代码时,没有编译错误。
为什么C允许将常量指针隐式转换为非常量指针?C有一个未定义行为的概念。它允许它编译程序,即使编译器注意到UB的可能性。在许多情况下,警告被忽略

在这种情况下(gcc)


C和C++是两种非常不同的语言,它们有自己的规则和语义(尽管语法有点相似)。常量正确性是它们不同的一个方面。MSVC抱怨:警告C4090:“初始化”:不同的“常量”限定符您的C编译器没有给您警告?MSVC和gcc都发出警告。你是如何编译的?C有着悠久而丰富的历史。有些编译器在默认情况下并不严格,因为这会破坏旧代码。您可能需要明确地告诉它。在类似GCC的编译器中,它将带有
-pedantic
标志。@DM-它仍然符合标准。该标准没有规定违反约束必须导致编译终止。它只说明编译器必须发出诊断。警告是一种诊断。实现可以自由地继续翻译程序,就好像它提供了一个扩展一样。如果您不想这样做,可以使用类似于
-pedanticerrors
标志的东西。
warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]