@CrazyHenry
2018-02-25T05:46:48.000000Z
字数 1786
阅读 1452
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_yingmin@outlookdotcom- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!
1.函数与定义
2.C++程序的using声明或者using指示在什么时候使用?
函数不能定义在任何函数体内,包括main函数。但是却可以在函数内声明一个函数。声明的函数会覆盖外层作用域的函数,即便函数名相同也不能跨越作用域重载。所以,不要在函数体内声明一个函数。
虽然不能在函数体内定义函数,但是却可以在函数体内定义class/struct。而类体内可以重载函数调用运算符。类体内可以定义任意函数。函数体内可以定义lambda表达式(函数对象)。
头文件一般是杜绝使用using的,因为这样会造成命名空间的污染。无论是对本公司还是其他公司来说,都会带来潜在的危害。
另外,源文件使用using声明,原则上是合理的。一般自己公司实现的类库里,类成员以及外部函数的实现(非内联或者constexpr)都放在相应的源文件中。只要你的源文件只包含严格遵循C++11新规范的Header,就可以使用using声明;如果你的源文件还include了一些头文件,而且这些头文件没有使用命名空间,那么这时你再使用using声明,就有可能造成命名空间的污染。
比如:
//file.hclass string {//...};//file.cc#include "file.h"using namespace std;//这时,std::string与file.h里的string就发生了冲突
解决方案是:使用命名空间
//file.h#include <string>#include <vector>...namespace mystring{class string{std::vector<char>//...};//在头文件全部使用显式std::来使用//inline function...//constexpr function...}//file.cc#include "file.h"using namespace std;namespace mystring{//这里使用std的时候,就可以隐式使用了!//function member...//外部函数实现(非内联非constexpr)...}
//main.cpp#include "file.h"#include <vector>//与file.h里的vector好像重复定义了int main(){//...}
如何解决重复定义的问题呢?防卫式声明!
//file.h#ifndef MY_FILE_H#define MY_FILE_H#include <string>#include <vector>...namespace mystring{class string{std::vector<char>//...};//在头文件全部使用显式std::来使用//inline function...//constexpr function...}#endif//file.cc#include "file.h"using namespace std;namespace mystring{//这里使用std的时候,就可以隐式使用了!//function member...//外部函数实现(非内联非constexpr)...}//main.cpp#include "file.h"#include <vector>int main(){//...}
实际上,#include "file.h"时,同时也#include <string> #include <vector>了,因为STL非常规范,所以vector有自己对应的防卫式声明。因此,在main.cpp里include <vector>的时候,就不会再次include了!当程序无意间多次#include <file.h>的时候,它的防卫式声明就起作用了!
