zoukankan      html  css  js  c++  java
  • 转载include包含源文件引发的错误 沉沉_

    初级内容,高手略过,下面直奔主题
    -------------
    include指令会将包含的文件内容展开在include指令的位置,通常我们用这个指令引入各种头文件。某本“通俗易懂”的书在讲解这个预处理指令的时候举了一个包含.c文件的例子并因而被鄙视。那么为什么正常情况下不应该用include指令包含一个源文件呢?

    要弄明白这个问题需要对C语言的编译方式有所了解。C语言的编译方式是分离式的,分为两步(假设只有一个生成目标):
    1、将一个或多个源文件编译成可重定位的目标文件,其中每个文件是分别编译的。
    2、将1步生成的可重定位目标文件链接成一个可执行目标文件或者共享目标文件。

    假设foo1.c中用include指令包含了foo2.c,foo2.c中定义了函数function且没有用static修饰。那么经过预处理,foo1.c中也将包含function的定义。于是foo1.c生成的可重定位目标文件(假设为foo1.o)和foo2.c(假设为foo2.o)都有function这个符号,这样上面所说的第二部就会因为冲突而失败。

    测试:
    Code::Blocks 10.05,编译器Mingw。
    新建一个C的Console application,添加function.c,内容如下:
    #include <stdio.h>
    void function(void)
    {
        printf("Call function\n");
    }
    main.c内容如下:
    #include <stdio.h>
    #include <stdlib.h>
    #include "function.c"

    int main()
    {
        printf("Hello world!\n");
        return 0;
    }
    构建提示:
    obj\Debug\function.o                         In function `function':
    D:\CB\test-link\function.c                   multiple definition of `function'
    obj\Debug\main.o:D:\CB\test-link\function.c     first defined here
    === Build finished: 2 errors, 0 warnings ===
    提示很明确:function多重定义。

  • 相关阅读:
    serialVersionUID作用
    为什么要使用SLF4J而不是Log4J
    认识Log4j
    Java解析xml文件四种方式
    数据结构之R进制转换
    栈的压入、弹出序列
    中间件学习之RMI+JDBC远端数据库的访问
    Linux程序设计综合训练之简易Web服务器
    Html5笔记之小结
    PhoneGap + Dreamweaver 5.5 无法在模拟器中打开的问题
  • 原文地址:https://www.cnblogs.com/chenchenluo/p/2164505.html
Copyright © 2011-2022 走看看