在GCC10中,gcc默认为fno-common。这意味着,所有暂定定义的符号都不常见。我认为gcc符合C规范,但在本地C程序中似乎没有通用符号。普通符号只用于扩展语法吗?
发布于 2020-06-05 05:37:26
本地C有共同的符号吗?
阅读C11标准n1570。的索引甚至没有提到常见的符号.
仔细阅读GCC文献和这份草稿的报告。
也许您指的是用于目标文件和可执行文件的LinuxforLinuxfor目标文件和可执行文件文件格式。在这里你可以找到一个常见的符号,这些符号往往被反对.阅读Linux规范等这里。
我的建议是在某个头文件中将所有公共符号声明为extern (在大多数*.c文件中为#include-d),并在单个翻译单位中定义它们一次(没有extern)。您可以使用简单的预处理器技巧(如X-宏)。
您可能对使用C代码生成器(如柠檬或大口 )或开发脚本(使用GNU awk或诡计、Python或GPP等)感兴趣。.)对于简单的元编程技术(自可能是鼓舞人心的),可以生成一些C代码。配置建筑自动化工具(GNU制造,忍者.)恰到好处。
您可能对使用最近GCC的静态分析器选项和预编译头感兴趣。还可以查看Clang静态分析仪、clang整齐和Frama-C。
你肯定想通过-Wall -Wextra -g -H 至 gcc,阅读https://ericlippert.com/2014/03/05/how-to-debug-small-programs/和https://modernc.gforge.inria.fr/download.html。
发布于 2020-06-05 08:44:27
不,它与“扩展语法”无关,也与作为语言结构的“公共符号”无关。它仅仅是指文件范围内变量声明的行为。
C表示,如果您将像int i;这样的声明放置在文件中,而不详细说明其他地方,那么它将具有外部链接,并将被视为定义为值为0。这被称为“暂定定义”。在不同的文件中具有相同名称的声明,如果它们具有外部链接,则都引用相同的变量。通常,使用外部链接的方法是在一个文件中定义一个变量,并在使用它的任何其他文件中使用extern声明。
在使用-fcommon的GCC中,同一变量的暂定定义可以出现在多个文件中。GCC将在链接时解决这个问题,并为变量分配一次存储(初始化为零)。
在使用-fno-common的GCC中,在编译文件时,会尽快将暂定定义解析为定义。如果多个文件包含变量的暂定定义,则这将在链接时导致多个定义错误。
据我所知,C标准并不要求或禁止任何一种行为。尤其是C++没有C++的“一个定义规则”。然而,-fno-common的行为通常不那么令人惊讶,它能更快地捕捉被遗忘的extern,并使编译器能够更好地优化(因为它在编译时确切地知道变量的位置,而不是等待稍后才能找到答案)。出于这些原因,GCC更改了默认设置。
https://stackoverflow.com/questions/62208811
复制相似问题