http://www.cnblogs.com/ShaneZhang/archive/2013/05/20/3088688.html

从工程上讲,头文件的文件名应该与对应的源文件名相同便于维护,如果头文件中包含了多个源文件中的定义或声明,则应该按源文件分组布局头文件中的代码,并且通过注释注明每组所在的源文件。当一个工程的文件较多时应该将源文件与头文件分开目录存放,一般头文件存放在include或inc目录下,而源文件存放在source或src目录下,根据经验,一个工程的文件数超过30个时应该将源文件与头文件分开存放,当文件较少时直接放到同一目录即可。

其实,C++标准中也没有确定这两种方式搜索文件filepath的顺序,而是由编译器的实现确定,其区别就是如果编译器按照第二种形式定义的顺序搜索文件filepath失败或者不支持这种方式时,将其替换为第一种顺序再进行搜索。

而实际上,一般来讲第一种方式都是先搜索编译器的系统目录,而第二种方式则是以被编译的头文件所在目录为当前目录进行搜索,如果搜索失败再在系统头文件里搜索。这两种方式从本质上讲没有什么区别,但当我们自己的程序文件与系统头文件重名时,用后者就会先搜到我们的头文件而不是系统的。但无论如何,与系统头文件重名都不是一个好习惯,一不小心就可能带来不必要的麻烦,当我们自己编写程序库时,最好把它放入一个目录里,不把这个目录直接添加到编译器的头文件搜索路径中(如gcc的-I, visual c++的/I选项等,其实在UNIX/Linux平台的编译器一般都是-I选项),而是添加到上一级目录,而在我们的源文件中引用该头文件时就包含该目录名,这样不容易造成冲突。

例如,我们创建了一个程序库叫mylib,其中一个头文件是strutil.hpp,我们可以创建一个/home/user/project/src/mylib目录,然后把strutil.hpp放进去,然后把 /home/user/project/src添加到编译选项里:

gcc -I/home/user/project/src

这样,在我们的源程序中可以这样引用strutil.hpp文件:

#include “mylib/strutil.hpp”

通过显示的目录名引用头文件就不容易产生冲突,不容易使我们自己的头文件与系统头文件产生混淆。

当然,从代码逻辑上我们还有另外一种解决冲突的方案,那就是命名空间,详见第[?]节。

http://blog.sina.com.cn/s/blog_6e0693f70100so42.html

VS做的很智能,一个F7就完成了预处理、编译、链接的所有工作。但是当工程比较大,使用的文件模块比较多, 一旦出现编译错误定位问题时就比较困难。因此,有时候需要对每个模块单独编译,就像Linux下编写的 makefile文件一下,分别编译每一个.o目标文件然后再链接成为一个.exe可执行程序。总结下在VS下使用命令行分别编译程序的方法。

在dos下编译的前提环境配置要求:

1.找到vs的cl.exe所在目录,在vs2010为F:\visual 2010\VC\bin,可参考。

2.点击“我的电脑”进行环境变量的配置,找到"path"变量加分号后加入刚才的路径。

3.重新运行cmd开启新的命令窗口,输入cl检查path设置是否生效。(只需配置一次即可,以后再次运行的时候不用再运行此命令)。

4.输入vcvars32,这条命令是运行同路径下的vcvars32.bat设置它的环境变量。

5.输入cl hello.cpp即可正常编译。

下面总结一些常用的命令:

通过快捷方式Visual Studio Command Prompt (2010)可以打开VS的命令行界面。

(1) 在命令行提示符窗口中输入:cl  /?   或者   cl -help 可以查看cl所有的命令选项。

(2) 在默认情况下cl编译完后会自动调用link进行链接,可以使用/c选项阻止链接。

(3) 编译一个文件命令:cl /FeMyapp 1.cpp,然后输入程序名Myapp执行程序。(注意1.h在本地,可以通过/I选 项指定头文件路径)

(4) 编译多个文件命令:cl /FeMyapp 1.cpp 2.cpp 3.cpp,然后输入程序名Myapp执行程序。

(5) 只输出 .i 预编译文件命令:cl /FiA /P A.cpp,然后会生成 A.i 预编译文件。这个方法类似Linux下的  gcc -E A.cpp -o A.i 命令。此命令的主要作用是用于检查未定义情况的错误。

(6) 只输出 .o 目标文件命令:cl /FoA /c A.cpp,然后会生成 A.obj 目标文件,类似Linux下的 .o 文件。注 意这里应该带上 /c 选项,原因见(2),即默认情况下,cl会自动对编译好的目标文件进行链接,如果此时,所 编译的目标文件引用了其他目标文件中的符号的话,就会出现链接错误。

参考网址 :http://zhidao.baidu.com/question/184905864

c语言头文件和源文件不在同一个目录的更多相关文章

  1. 理解C++中的头文件和源文件的作用【转】

    一.C++编译模式通常,在一个C++程序中,只包含两类文件--.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C+ ...

  2. C++基础之头文件和源文件的关系

    今天找了个解析xml的开源C++项目tinyxml,按照网上的说法去编译,但是一直编译不通过,"无法打开头文件tinyxml.h",但是明明我在工程底下有了这个文件,对于我这种初学 ...

  3. idea 开发javaee 时,出现访问的文件和源文件不一样,没有正常更新的解决方案

    这是因为我配置的idea debug 运行模式 输出的文件在 out 和 target 目录下,因为idea本身的原因,导致这两个目录没有及时更新, 导致前端在访问时的页面源码和ide中的一直不一样, ...

  4. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  5. C头文件和源文件的连

    (http://blog.163.com/yui_program/blog/static/18415541520115177852896/) 一.源文件如何根据#include来关联头文件 1,系统自 ...

  6. C++学习笔记(一):头文件和源文件

    说明: 当一个源文件(a.cpp)要调用另一个源文件(b.cpp)定义的方法时,需要在a.cpp中写上这个方法的声明(只需要该方法的名称.返回值和参数,类似Java的接口): 如果每次调用其他文件的方 ...

  7. C++中的头文件和源文件

    一.C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C ...

  8. 学习:C++中的头文件和源文件详解

    一.C++编译模式: 通常,在一个C++程序中,只包含两类文件――.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是 ...

  9. C++中头文件(.h)和源文件(.cpp)都应该写些什么

    头文件(.h): 写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等,但一般来说不写出具体的实现. 在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下): ...

随机推荐

  1. makefile教程网址

    http://www.cnblogs.com/wang_yb/p/3990952.html

  2. SOS.dll(SOS 调试扩展)

      SecAnnotate.exe(.NET 安全批注器工具) SignTool.exe(签名工具) Sn.exe(强名称工具) SOS.dll(SOS 调试扩展)   SqlMetal.exe(代码 ...

  3. 完整DataTable与IList互换(转)

    public class CollectionHelper { private CollectionHelper() { } public static DataTable ConvertTo< ...

  4. Source Insight中文操作支持的宏

    以下是Source Insight中文字符串支持的宏的实现,在此做个备份. 代码来自网上,非笔者所写.原有代码有个明显的Bug(Del的时候会导致多删除一个字符和多插入一个空格),已经被笔者fix掉. ...

  5. Matlab中find函数的使用

    一.问题来源 看到了 min_score_pos = find(A0_scores==min(A0_scores), 1); [r,c] = find(X,k),返回X中第k个非零元素的行列位置. 二 ...

  6. oracle 删除表、数据

        truncate ddl语句,删除表中数据,速度要比delete快:且所有自增字段重新开始计数:删除数据保留表结构:删除的数据不进入rollback segment,无法恢复.例: trunc ...

  7. HTML/CSS中常遇到的bug 一些注意事项总结

    1.IE6下横向双倍margin bug (触发条件:块属性标签:float:横向margin设置:IE6下.解决办法:css中加入display:inline.) 2.css中公用属性首先声明:如对 ...

  8. java split函数 对空的处理

    String str = "5,6,55,66,,,,@"; String[] chk_deep = str.split("@"); System.out.pr ...

  9. Palindrome Partitioning II

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  10. AJAX请求也会重新刷新整个页面?

    由于对HTML的一些内置行为不理解,所以面对今天的AJAX请求也会重新绘页面百思不得其解. 后来,请教跟伟哥同属前端组的杨成之后,才知道是由于button的默认行为导致的. 需要阻止这种标签行为,才可 ...