没有原型的静态函数(AIX 编译器允许,gcc 不允许)
Posted
技术标签:
【中文标题】没有原型的静态函数(AIX 编译器允许,gcc 不允许)【英文标题】:static function with no prototype (AIX compiler allowed, gcc doesn't) 【发布时间】:2020-08-15 00:19:47 【问题描述】:我正在尝试将大量模块从 AIX 移植到 Linux。不幸的是,AIX xlc 编译器允许您定义一个静态函数并在没有原型的情况下在定义之前使用它。不好,但至少你得到了正确的静态范围。无论如何,代码就在那里,如果不显式添加静态原型,我无法让它在 Linux 上编译。
那么,有什么方法可以抑制 gcc 中的“静态声明遵循非静态声明”错误(或使其成为警告而不是硬错误),还是我必须编辑每个模块以添加原型他们在哪里失踪?据我了解,这是一种标准行为未定义的情况-因此,如果 gcc 不允许您放宽其内部标准以允许在其他地方编译的代码,那么这有点令人讨厌,不...?
【问题讨论】:
请附上minimal reproducible example 【参考方案1】:自 2004 年以来,这一直是 GCC 中的一个硬错误。编译它的唯一选择是降级到一个非常旧的 GCC 版本。我验证了 GCC 3.4.6 仍然可以编译,但 GCC 4.0.3 没有。
当然,根据您的目标,让 GCC 3.4 工作可能几乎是不可能的。
【讨论】:
谢谢。我以前很怕那个。我在大约 2000 年移植了这个东西的早期版本,并没有看到这个错误。但时间在前进。我可以在遇到它们时修复它们。 虽然我引起了您的注意,但我看到的另一个类似问题上次也不是问题。具有结构作为参数的函数的原型现在似乎必须在结构定义之后定义。如果不是,您在调用函数时会收到一条令人讨厌的错误消息,指出参数与原型不匹配 - 更糟糕的是,它会显示似乎匹配的原型。在结构定义修复这个问题之后移动原型。但 2000 年的 gcc 不是问题...... 在过去,它可能依赖于目标,以及它是否可以在寄存器中传递结构。 这是关于“问题”的另一个变体。我发现一个模块由于某种原因在它使用的库中包含了一个函数的本地静态版本——在包含文件的顶部有一个非静态原型。这样做应该很安全。即,我想要我自己的特殊版本的函数只用于这个模块(用于调试或其他目的)。在任何情况下,如果您在调用它之前将原型重新定义为静态,那么 gcc 只是过于挑剔地将其视为硬错误,IMO。以上是关于没有原型的静态函数(AIX 编译器允许,gcc 不允许)的主要内容,如果未能解决你的问题,请参考以下文章
AIX 的 XL 编译器的 -qfuncsect 选项的 gcc 等效选项是啥?
编译器错误? g++ 允许可变大小的静态数组,除非函数是模板化的