[关闭]
@CrazyHenry 2018-02-25T13:46:48.000000Z 字数 1786 阅读 1222

0.x 1.函数与定义和2.C++程序的using声明或者using指示在什么时候使用

ccccC++Primer


1.函数与定义
2.C++程序的using声明或者using指示在什么时候使用?

1.函数与定义

函数不能定义在任何函数体内,包括main函数。但是却可以在函数内声明一个函数。声明的函数会覆盖外层作用域的函数,即便函数名相同也不能跨越作用域重载。所以,不要在函数体内声明一个函数。

虽然不能在函数体内定义函数,但是却可以在函数体内定义class/struct。而类体内可以重载函数调用运算符。类体内可以定义任意函数。函数体内可以定义lambda表达式(函数对象)。

2.C++程序的using声明或者using指示在什么时候使用?

头文件一般是杜绝使用using的,因为这样会造成命名空间的污染。无论是对本公司还是其他公司来说,都会带来潜在的危害。
另外,源文件使用using声明,原则上是合理的。一般自己公司实现的类库里,类成员以及外部函数的实现(非内联或者constexpr)都放在相应的源文件中。只要你的源文件只包含严格遵循C++11新规范的Header,就可以使用using声明;如果你的源文件还include了一些头文件,而且这些头文件没有使用命名空间,那么这时你再使用using声明,就有可能造成命名空间的污染。
比如:

  1. //file.h
  2. class string {//...};
  3. //file.cc
  4. #include "file.h"
  5. using namespace std;
  6. //这时,std::string与file.h里的string就发生了冲突

解决方案是:使用命名空间

  1. //file.h
  2. #include <string>
  3. #include <vector>
  4. ...
  5. namespace mystring
  6. {
  7. class string{std::vector<char>//...};
  8. //在头文件全部使用显式std::来使用
  9. //inline function
  10. ...
  11. //constexpr function
  12. ...
  13. }
  14. //file.cc
  15. #include "file.h"
  16. using namespace std;
  17. namespace mystring
  18. {
  19. //这里使用std的时候,就可以隐式使用了!
  20. //function member
  21. ...
  22. //外部函数实现(非内联非constexpr)
  23. ...
  24. }
  1. //main.cpp
  2. #include "file.h"
  3. #include <vector>//与file.h里的vector好像重复定义了
  4. int main()
  5. {//...}

如何解决重复定义的问题呢?防卫式声明!

  1. //file.h
  2. #ifndef MY_FILE_H
  3. #define MY_FILE_H
  4. #include <string>
  5. #include <vector>
  6. ...
  7. namespace mystring
  8. {
  9. class string{std::vector<char>//...};
  10. //在头文件全部使用显式std::来使用
  11. //inline function
  12. ...
  13. //constexpr function
  14. ...
  15. }
  16. #endif
  17. //file.cc
  18. #include "file.h"
  19. using namespace std;
  20. namespace mystring
  21. {
  22. //这里使用std的时候,就可以隐式使用了!
  23. //function member
  24. ...
  25. //外部函数实现(非内联非constexpr)
  26. ...
  27. }
  28. //main.cpp
  29. #include "file.h"
  30. #include <vector>
  31. int main()
  32. {//...}

实际上,#include "file.h"时,同时也#include <string> #include <vector>了,因为STL非常规范,所以vector有自己对应的防卫式声明。因此,在main.cppinclude <vector>的时候,就不会再次include了!当程序无意间多次#include <file.h>的时候,它的防卫式声明就起作用了!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注