dram.me

《C陷阱与缺陷》读书笔记(第4章)

4.1 什么是连接器

4.2 声明与定义

在 gcc 中,如果对外部变量重定义,如果两次定义都赋了初值则会报错,否则会编译通过。

4.3 命名冲突与 static 修饰符

通过合理利用 static 来声明全局变量和函数可以有利避免名字冲突。

4.4 形参、实参与返回值

如果函数没有声明或定义就被调用,默认返回类型为整型。比如下面这段程序:

int
main(void)
{
    printf("%fn", square(2.0));

    return 0;
}

double
square(double x)
{
    return x * x;
}

在 gcc 中,上面这段程序无法通过编译,说是类型冲突,可见在调用 square 时没找到 square 的声明或定义,gcc 默认将其声明为 int square(double),但后面的定义类型不符合。如果将下面的定义返回类型改为 int,则编译器不会报错。

4.5 检查外部类型

char filename[] = "/etc/passwd";
extern char* filename;

理论上是不行的,但好像 gcc 并不会报错,不知道是哪里有问题?

4.6 头文件

外部变量尽量在头文件中声明,并且定义这个外部变量的c文件也应该include这个文件,这样可以做到有效的类型检查。