标签:ios 运行时 输出 shape 重复包含 源文件 重定义 .net .com
由于头文件是为了重用,所以在一个复杂的程序中,头文件可能会被间接地重复包含。如果头文件里面都是函数声明,那问题还不大。如果头文件里面有函数定义(如程序11.2),那么就会出现函数被重复定义的错误,程序将无法运行。我们可以采用函数声明和定义分离的方式:把所有的声明都放在shape.h中,把所有的定义放在shape.cpp中。注意必须在shape.cpp中包含shape.h,否则在编译连接时会发生错误。我们在使用时仍然包含shape.h,但由于函数的定义并不在该头文件中,所以就不会被重复定义了。
我们几乎每次编写程序的时候都要用到#include命令,那么这条命令到底是什么意思呢?
#include是一条编译预处理命令。什么叫编译预处理命令呢?我们知道,程序中的每一句语句会在运行的时候能得到体现。比如变量或函数的声明会创建一个变量或者函数,输出语句会在屏幕上输出字符。然而编译预处理命令却不会在运行时体现出来,因为它是写给编译器的信息,而不是程序中需要执行的语句。编译预处理命令不仅仅只有#include一条,在C++中,所有以#开头的命令都是编译预处理命令,比如#if、#else、#endif、#ifdef、#ifndef、#undef和#define等等。
当编译器遇到了#include命令后,就把该命令中的文件插入到当前的文件中。不难想象,程序11.2的main.cpp文件实质上包含了shape.h文件中的所有语句。所以它能够顺利调用shape.h文件中的各个函数。
来源:http://c.biancheng.net/cpp/biancheng/view/65.html
问题: h头文件还有c文件中该放些什么东西?
描述:
以前我都是在.h头文件中定义函数,然后把.h文件include到main()所在的.c文件,在mian()函数中调用.h中的函数。
最近有朋友告诉我不能这么做,应该把函数声明写在.h中,另外建个.c文件定义具体的函数操作,再把.h文件include到main()所在的.c文件,调用即可。
不知这个问题怎么处理才好?
解决方案1:
函数声明写在.h中,另外建个.c文件定义具体的函数操作,再把.h文件include到main()所在的.c文件
解决方案2:
最近有朋友告诉我不能这么做,应该把函数声明写在.h中,另外建个.c文件定义具体的函数操作,再把.h文件include到main()所在的.c文件,调用即可。
一般是在.h里声明,在对应名字的.cpp里写接口跟功能,(模板除外),然后其他.cppx需要调用就包含头文件就可以了.
解决方案3:
一个好习惯,除了static,inline,extern函数,正常的函数不要在.h里实现,只是把申明放在h里,实现放在。c里。
解决方案4:
一般推荐头文件用于放声明,源文件用于定义和实现,但是有些定义也可以放在头文件中。
解决方案5:
你的朋友是对的。
这个问题的关键在于你的方法是适合在小的工程中,不会有多次包含头文件的情况,或者很容易避免这样的情况,如果项目的代码比较多的时候,
你的方法就会有比较大的问题。
会出现多个文件同时包含一个。h文件,然后编译的过程就出现重定义,然后你只好吭哧吭哧该代码吧。。。
解决方案6:
可以包含宏定义、类定义、结构体定义、模板定义、全局变量声明,函数声明、内联函数定义等。
不要包含全局变量定义,函数定义。
以上的例子可能列举得还不全。
其实从本质上讲,只需要明白一件事:头文件是用来被别人包含的,因此同一个头文件极有可能被两个以上的cpp文件所包含(比如<iostream>就常被多个cpp文件包含)。因此凡是在两个编译单元重复出现两次会出错的东西都不要放在.h中。
链接:http://www.codes51.com/itwd/2908358.html
标签:ios 运行时 输出 shape 重复包含 源文件 重定义 .net .com
原文地址:http://www.cnblogs.com/haloboy/p/7305705.html