繁体   English   中英

函数调用可以舍弃其参数的cons限定符吗?

[英]Can a function call discard cons qualifier of its parameter?

以下代码在Green Hills C编译器中导致错误(错误:int *类型与参数类型const int *不兼容),而仅产生警告并使用gcc进行编译(警告:传递'func'的参数1会丢弃'const '来自指针目标类型的限定符)。

void func1(int* a)
{
  (*a)++;
}

const int g = 100;

void func2(void)
{
  func1(&g);
}

哪种行为符合C标准?

func1(&g)的调用无效。 这是C语言中的一个违反约束的行为 ,即在日常术语中通常被称为“错误”。 C语言不支持将const int *值隐式转换为int *类型。

在海湾合作委员会中这只是“警告”,这一事实并不意味着任何事情。 在GCC中使用-pedantic-errors开关将其违反约束报告为“错误”。 正如您所观察到的,Green Hills C编译器将其报告为“错误”,而没有您的任何帮助。

哪种行为符合C标准?

两种编译器行为均符合标准。 正如@AnT已经解释的那样,调用func1(&g)违反了语言约束。 在这种情况下,标准对编译器的要求由第5.1.1.3/1段表达:

如果预处理翻译单元或翻译单元包含任何语法规则或约束的违反,则符合标准的实现应产生至少一个诊断消息(以实现定义的方式标识)。[...]

如您所见,@ Olaf是正确的,该标准没有区分诊断的不同类别。 这是实现方式中,通常区分基于所述状况是否是致命的编译过程两者之间的发明和CON vention。 该标准没有进一步说明在检测到约束违规时编译器应采取的措施,但是,无论是在一般情况下还是在这种特定情况下,该标准都没有,因此它甚至没有间接指示应警告还是警告发射。

如果编译器确实继续运行并最终生成了可执行文件,则整个结果程序在运行时的任何时候都会评估有问题的函数调用时,都将表现出不确定的行为。 这就是为什么编译器可能选择不发出这样的二进制文件的原因(即可能认为违反约束是“错误”),但是,该标准再次没有提供任何指导。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM