在库的*.h头文件中C,应该声明函数
extern void f();
// or only
void f();
Run Code Online (Sandbox Code Playgroud)
CC++.从我的书:
.bss段:
未初始化的全局C变量
共同:
尚未分配的未经初始化的数据对象
我不得不说,我看不出明显的区别.我甚至不太明白什么是无限制的,未分配的数据对象......似乎什么都没有.我使用GNU的readelf工具试着看一些简单的C代码,但找不到一个COMMON符号.我读过像FORTRAN的COMMON类型的东西是一个COMMON符号的例子 - 但我不知道FORTRAN
有人可以为我区分这两个吗?如果可能的话,希望用C的例子?非常感激.
编辑:从这篇文章中,变量c在这里:
int c;
int main() {} ...
Run Code Online (Sandbox Code Playgroud)
应该是COMMON.但是使用objdump -t节目给我说c在.bss中......
困惑
翻译单元的常用定义是预处理之后(头文件包含,宏等与源文件一起).这个定义相当清楚,C标准5.1.1.1,C11说:
AC程序不需要全部同时翻译.该程序的文本保存在本国际标准中称为源文件(或预处理文件)的单元中.源文件以及通过预处理指令包含的所有头文件和源文件
#include称为预处理转换单元.在预处理之后,预处理翻译单元被称为翻译单元.
更仔细地阅读第一句话:
AC程序不需要全部同时翻译.
这意味着(对我来说),C程序可以在同一个程序中进行翻译,而不必将它们分成多个预处理源文件.同样在同一段的末尾,标准说:
翻译单元可以单独翻译,然后链接以产生可执行程序.
可以(通常是)解释为编译单个目标文件,然后最终链接它们以生成单个可执行程序.但是,如果可以从上述语句中提出问题并询问:这是否意味着实现可以自由地将多个源文件视为单个翻译单元,尤其是对于以下调用:
gcc file1.c file2.c -o out
Run Code Online (Sandbox Code Playgroud)
编译器可以访问整个源?
特别是,如果某个实现将file1.c+ file2.c(上述)视为单个翻译单元,是否可以将其视为不合格?