链接器怎么处理文件包含的?

hollebab 2014-05-26 04:19:18
我的问题在下面的代码里
1.c
#include "3.h"
main()
{
}

2.c
#include "3.h"

3.h
struct token {
int i;
int j;
};

最后
gcc test1.c test2.c

编译通过.
但是这里还有一个文件
4.c
#include "3.h"
#include "3.h"
main()
{
}

编译出错
我想问为什么多文件编译就能通过,我认为和4.c的编译结果应该一样
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sorcerer314 2014-06-26
  • 打赏
  • 举报
回复
我觉得LZ首先应先看下编译器报出的错误是什么. 我想编译器在编译test1.c,test2.c时应该是分开编译的,也就是每个.c文件包含的头文件只展开一次. 但是如果在test3.c包含头文件2次,那在编译次文件时,头文件被展开了两次。 可能GCC默认这种行为是不合法的,当然我们可以通过宏定义的形式去避免.
hollebab 2014-05-26
  • 打赏
  • 举报
回复
好吧,这个问题留到N年后再来看
赵4老师 2014-05-26
  • 打赏
  • 举报
回复
引用 4 楼 hollebab 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 参考gcc和ld源代码。
有那个能力早自己看了[/quote] 但我看好你有这个能力。
hollebab 2014-05-26
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
参考gcc和ld源代码。
有那个能力早自己看了
赵4老师 2014-05-26
  • 打赏
  • 举报
回复
参考gcc和ld源代码。
hollebab 2014-05-26
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
1. 不关链接器的事情,出错在编译阶段。 2. 4.c 重复包含了3.h 3. .h 文件应该使用header guard, 防止重复定义。

#ifndef HEADER_3_H
#define HEADER_3_H
struct token {
    int i;
    int j;
};
#endif /* HEADER_3_H */
但是gcc test1.c test2.c这种情况对于编译器来说,不就相当于重复包含吗?因为编译器看到了2次#include语句啊
mymtom 2014-05-26
  • 打赏
  • 举报
回复
1. 不关链接器的事情,出错在编译阶段。 2. 4.c 重复包含了3.h 3. .h 文件应该使用header guard, 防止重复定义。

#ifndef HEADER_3_H
#define HEADER_3_H
struct token {
    int i;
    int j;
};
#endif /* HEADER_3_H */

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧