【问题标题】:include and using declaration包含和使用声明
【发布时间】:2012-12-04 07:16:48
【问题描述】:
using ::bb::cascades::Application;

#include <bb/cascades/Application>

这两个声明是什么意思?

有没有什么好的教程可以深入地说明 using 指令/声明?谢谢。

【问题讨论】:

标签: c++ include using-directives using-declaration


【解决方案1】:

#include 是一个前置指令。它基本上是告诉前驱获取给定的文件并将#include 行替换为文件内容。

另一方面,using 使得可以在 namespace (结构、枚举、函数)中使用没有 namespace 前缀的名称。在这种情况下,::bb::cascades::Application 将使您能够使用 write

Application app;

而不是

::bb::cascades::Application app;

如果::bb::cascades::Application 是默认可构造类。

“为什么我需要使用#include?”

为了使用函数或创建对象,编译器必须知道这些事物的结构,例如函数签名或类的成员和方法。这些东西都写在头文件中。让我们看一个非常简单的例子,我们提供了一些模块(称为module):

模块module

// MODULE_HPP
// only declarations, no code
namespace module{
    struct dummyStruct{
        void dummyMethod(char);
        char dummyMember;
    };
    double dummyFunc(double);
};
// MODULE_CPP
// actual implementation
namespace module{
    void dummyStruct::dummyMethod(char c){
        dummyMember = c;
    };
    void dummyFunc(double a){
        return a + 1;
    }
};

如您所见,我们的module 由一个带有成员和方法的结构以及一个简单的函数组成。请注意,我们将所有内容都包装在命名空间module 中。现在我们有另一个程序想要使用module:

#include <iostream>
using module::dummyFunc;

int main(){
    std::cout << dummyFunc(1) << std::endl;
}

这是行不通的,因为编译器不知道命名空间module。您需要添加声明,这可以通过使用#include 来完成(请参阅此答案的第一段):

#include <iostream>
#include "module.hpp"
using module::dummyFunc;

int main(){
    std::cout << dummyFunc(1) << std::endl;
}

请注意,您需要同时编译 module.cpp 和 main.cpp,否则会出现链接器错误。

【讨论】:

  • 那为什么我需要使用包含?我可以做“包含”可以用“使用指令”做的事情吗?
  • 不,你不能。您不能将未包含在 #include 中的内容纳入范围。 “使用”仅允许您使用其他范围内的东西,而无需完全限定它们。但是范围必须自己可见,这就是您使用#include 的目的
  • 你能举个例子解释一下吗:) 谢谢。
  • @kalkin:改进了我的答案。
  • 所以为了使示例正常工作,我需要“包含”声明命名空间“模块”的文件对吗?
猜你喜欢
  • 2016-06-18
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多