Chinaunix

标题: 关于boost中的一段代码的疑问--编译器怎么找到函数的[已解决] [打印本页]

作者: Suchangyu    时间: 2008-11-29 21:57
标题: 关于boost中的一段代码的疑问--编译器怎么找到函数的[已解决]
以下是官方给出的调用boost库中program_options的代码范例(这里仅节选了部分):

  1. #include <boost/program_options.hpp>
  2. namespace po = boost::program_options;

  3. #include <iostream>
  4. #include <fstream>
  5. #include <iterator>
  6. using namespace std;

  7. int main(int ac, char* av[])
  8. {
  9.     try {
  10.         int opt;

  11.         po::options_description config("Configuration");
  12.         config.add_options()
  13.             ("optimization", po::value<int>(&opt)->default_value(10),
  14.                   "optimization level")
  15.             ("include-path,I",
  16.                  po::value< vector<string> >()->composing(),
  17.                  "include path")
  18.             ;

  19.         po::variables_map vm;
  20.         po::options_description config_file_options;
  21.         config_file_options.add(config);

  22.         ifstream ifs("multiple_sources.cfg");
  23.         store(parse_config_file(ifs, config_file_options), vm);
  24.         notify(vm);
  25.         cout << "Optimization level is " << opt << "\n";
  26.     }
  27.     catch(exception& e)
  28.    {
  29.         cout <<"error:" << e.what() << "\n";
  30.         return 1;
  31.     }
  32.     return 0;
  33. }
复制代码


这段代码可以通过编译,我的疑问是按照头文件boost/program_options.hpp中的定义,store和notify函数是在名字空间boost::program_options中声明的,这里没有指定,编译器是怎么定位此函数的?

[ 本帖最后由 Suchangyu 于 2008-12-1 17:51 编辑 ]
作者: lenovo    时间: 2008-11-30 11:41
没看到
namespace po = boost::program_options;
这一句?
作者: Suchangyu    时间: 2008-12-01 14:49
原帖由 lenovo 于 2008-11-30 11:41 发表
没看到
namespace po = boost::program_options;
这一句?


这里是定义了一个名字空间别名。
但是由于没有使用using,这个别名在main中应该是不可见的吧?
作者: lenovo    时间: 2008-12-01 15:15
原帖由 Suchangyu 于 2008-12-1 14:49 发表


这里是定义了一个名字空间别名。
但是由于没有使用using,这个别名在main中应该是不可见的吧?

那你说

  1. po::options_description config_file_options;
复制代码

是什么意思?
这么短短几行代码,你每句都搞懂了吗?
作者: Suchangyu    时间: 2008-12-01 15:29
原帖由 lenovo 于 2008-12-1 15:15 发表

那你说

po:ptions_description config_file_options;
是什么意思?
这么短短几行代码,你每句都搞懂了吗?


我的理解是:
声明了一个类对象config_file_options,这个对象是在名字空间po中定义的options_description类的实例。

ps. 每句完成的事情(功能)我都清楚,但是为什么可以这样用,还理解得不深。
请版主指正。

[ 本帖最后由 Suchangyu 于 2008-12-1 15:31 编辑 ]
作者: lenovo    时间: 2008-12-01 16:10
原帖由 Suchangyu 于 2008-12-1 15:29 发表


我的理解是:
声明了一个类对象config_file_options,这个对象是在名字空间po中定义的options_description类的实例。

ps. 每句完成的事情(功能)我都清楚,但是为什么可以这样用,还理解得不深。
请版 ...

名字空间po指得是哪个名字空间?
建议你复习一下名字空间的用法。
看看有几种使用方式。
作者: Suchangyu    时间: 2008-12-01 16:26
原帖由 lenovo 于 2008-12-1 16:10 发表

名字空间po指得是哪个名字空间?
建议你复习一下名字空间的用法。
看看有几种使用方式。


名字空间po就是boost::program_options。

我就只知道using的一种方法的,请版主提示一下吧。
作者: 5毛党党员    时间: 2008-12-01 16:29
原帖由 lenovo 于 2008-12-1 16:10 发表

名字空间po指得是哪个名字空间?
建议你复习一下名字空间的用法。
看看有几种使用方式。

我想lz问的是boost::program_options::store 为什么可以简写成store? 还有boost::program_options::notify也是。。。。
其他在boost::program_options这个域下的函数都有 po:: 啊,就这两个没有
作者: lenovo    时间: 2008-12-01 17:17
原帖由 5毛党党员 于 2008-12-1 16:29 发表

我想lz问的是boost::program_options::store 为什么可以简写成store? 还有boost::program_options::notify也是。。。。
其他在boost::program_options这个域下的函数都有 po:: 啊,就这两个没有

怪我没仔细看清楚问题。
不过我手头上并没有boost可以测试,
去他们网站找了如下资料:
http://www.boost.org/doc/libs/1_ ... tions/tutorial.html
可以看到前面是有po的。
作者: Suchangyu    时间: 2008-12-01 17:47
标题: 回复 #9 lenovo 的帖子
谢谢版主的解答,我找到问题答案了。
这是c++编译是容易被忽略的名字空间查找规则:
在C++中有这样一个名字查找规则--如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找


请参考如下文章:
http://blog.csdn.net/starlee/archive/2007/12/10/1926377.aspx

我用g++ (GCC) 3.4.5 做了试验,验证了该规则。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2