@CrazyHenry
2018-02-25T13:46:48.000000Z
字数 1786
阅读 1222
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_
yingmin@
outlookdot
com- 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.h
class 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>
的时候,它的防卫式声明就起作用了!