首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地C有共同的符号吗?

本地C有共同的符号吗?
EN

Stack Overflow用户
提问于 2020-06-05 05:34:09
回答 2查看 353关注 0票数 4

在GCC10中,gcc默认为fno-common。这意味着,所有暂定定义的符号都不常见。我认为gcc符合C规范,但在本地C程序中似乎没有通用符号。普通符号只用于扩展语法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-05 05:37:26

本地C有共同的符号吗?

阅读C11标准n1570的索引甚至没有提到常见的符号.

仔细阅读GCC文献这份草稿的报告。

也许您指的是用于目标文件可执行文件的LinuxforLinuxfor目标文件可执行文件文件格式。在这里你可以找到一个常见的符号,这些符号往往被反对.阅读Linux规范等这里

我的建议是在某个头文件中将所有公共符号声明为extern (在大多数*.c文件中为#include-d),并在单个翻译单位中定义它们一次(没有extern)。您可以使用简单的预处理器技巧(如X-宏)。

您可能对使用C代码生成器(如柠檬大口 )或开发脚本(使用GNU awk诡计PythonGPP等)感兴趣。.)对于简单的元编程技术(可能是鼓舞人心的),可以生成一些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

票数 4
EN

Stack Overflow用户

发布于 2020-06-05 08:44:27

不,它与“扩展语法”无关,也与作为语言结构的“公共符号”无关。它仅仅是指文件范围内变量声明的行为。

C表示,如果您将像int i;这样的声明放置在文件中,而不详细说明其他地方,那么它将具有外部链接,并将被视为定义为值为0。这被称为“暂定定义”。在不同的文件中具有相同名称的声明,如果它们具有外部链接,则都引用相同的变量。通常,使用外部链接的方法是在一个文件中定义一个变量,并在使用它的任何其他文件中使用extern声明。

在使用-fcommon的GCC中,同一变量的暂定定义可以出现在多个文件中。GCC将在链接时解决这个问题,并为变量分配一次存储(初始化为零)。

在使用-fno-common的GCC中,在编译文件时,会尽快将暂定定义解析为定义。如果多个文件包含变量的暂定定义,则这将在链接时导致多个定义错误。

据我所知,C标准并不要求或禁止任何一种行为。尤其是C++没有C++的“一个定义规则”。然而,-fno-common的行为通常不那么令人惊讶,它能更快地捕捉被遗忘的extern,并使编译器能够更好地优化(因为它在编译时确切地知道变量的位置,而不是等待稍后才能找到答案)。出于这些原因,GCC更改了默认设置。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62208811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档