当前位置: 首页 > 知识库问答 >
问题:

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

甘明朗
2023-03-14

以下代码在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标准?

共有2个答案

董同
2023-03-14

哪些行为符合C标准?

这两种编译器行为都符合标准。正如@AnT已经解释的,调用func1(

如果预处理翻译单元或翻译单元违反任何语法规则或约束[…],则一致性实现应产生至少一条诊断消息(以实现定义的方式识别)

正如你所看到的,@Olaf是对的,标准没有区分不同类别的诊断。这是一个发明和实现惯例,通常根据情况对编译过程是否致命来区分两者。标准没有进一步说明当检测到违反约束时编译器应该做什么,然而,无论是一般情况下还是在这个特定情况下,它甚至没有间接规定应该发出“警告”还是“错误”。

如果编译器继续运行并最终生成一个可执行文件,那么如果在运行过程中的任何时候对有问题的函数调用求值,那么整个生成的程序都会表现出未定义的行为。这是编译器可能选择不发射这样一个二进制文件的原因(也就是说,可能会考虑约束违反“错误”),但是,再一次,标准没有提供任何指导。

柴茂材
2023-03-14

函数的调用

它在GCC中“只是一个警告”这一事实并不意味着什么。在GCC中使用-迂腐-错误开关,使其将约束违规报告为“错误”。Green Hills C编译器,正如您自己所观察到的,在没有任何帮助的情况下将其报告为“错误”。

 类似资料:
  • 我有一个类缓存,它的函数write指定为 我这样调用这个函数。 上面的一行给了我以下错误 将“const Cache”作为“bool Cache::write(const MemoryAccess)”的“this”参数传递 this参数是特定于编译器的,它有助于代码混乱和中断本地命名空间变量优先级。但这样的变量并没有在这里传递。

  • 下面是一个基本的代码片段,我得到了一个错误: 错误:传递'constd::map 注意:我知道我可以在不使用的情况下删除点,但上面的代码片段只是一个更大问题的示例。 我检查了一些关于类似错误的问题: 错误:传递constd::映射 但在这两种情况下,都是因为被声明为。另一方面,我试图使用/访问的

  • 错误:将“const A”作为“void A::hi()”的“this”参数传递会丢弃限定符[-fppermissive] 我不明白为什么会出现这个错误,我没有返回任何东西,只是传递了对象的引用,就是这样。 编辑 我用const correction修复了它,但是现在我试图在同一个方法中调用方法,我得到了同样的错误,但奇怪的是我没有传递这个方法的引用。 错误:将“const A”作为“void A

  • 我有与这里、这里或这里相同的问题,除了我为参数和函数设置了const: 但我有同样的编译错误:

  • 我将对象的引用传递给函数,并使用const表示它是只读方法,但如果我在该方法中调用另一个方法,即使我没有将引用作为参数传递,也会发生此错误。 错误:将'const A'传递为'valA::hello()'的'this'参数会丢弃限定符[-fpermissive] 错误:将“const A”作为“void A::world()”的“this”参数传递将丢弃限定符[-fpermissive]

  • 问题内容: 我知道JavaScript函数可以接受“任意”数量的参数。 但是我想知道实际上有多少个“任何”个数是否有限制? 例如,假设我向提出了一百万个论点。那行得通吗?还是口译员会翻身? 我猜测最大值是(a)特定于实现的(b),因为对象是类似数组的。 我在语言规范中没有看到这一点,但是可能没有连接点。 问题答案: 尽管没有具体限制规范中参数的理论最大数目这些限制是完全依赖于实现的,最有可能,也将