相关疑难解决方法(0)

C与C++中的外部函数

在库的*.h头文件中C,应该声明函数

extern void f();

// or only 

void f();
Run Code Online (Sandbox Code Playgroud)
  1. 仅在使用时 C
  2. 当使用时C++.

c c++

36
推荐指数
3
解决办法
7万
查看次数

.bss vs COMMON:到底是什么?

从我的书:

.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 linker elf

19
推荐指数
3
解决办法
9310
查看次数

究竟什么是C中的翻译单元

翻译单元的常用定义是预处理之后(头文件包含,宏等与源文件一起).这个定义相当清楚,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(上述)视为单个翻译单元,是否可以将其视为不合格?

c language-lawyer

17
推荐指数
4
解决办法
2334
查看次数

标签 统计

c ×3

c++ ×1

elf ×1

language-lawyer ×1

linker ×1