包含和使用声明

include and using declaration

提问人:Tahlil 提问时间:12/17/2012 最后编辑:juanchopanzaTahlil 更新时间:12/17/2012 访问量:111

问:

using ::bb::cascades::Application;

#include <bb/cascades/Application>

这两个声明是什么意思?

有没有好的教程可以深入说明使用指令/声明?谢谢。

C++ 包括 using 指令 using-declaration

评论

0赞 Angew is no longer proud of SO 12/17/2012
你可能应该拿起并阅读一本好书

答:

3赞 Zeta 12/17/2012 #1

#include是 prepocessor 指令。它基本上告诉前置者获取给定的文件并用文件内容替换该行。#include

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

Application app;

而不是

::bb::cascades::Application app;

if 是默认的可构造类。::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;
    }
};

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

#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,否则会出现链接器错误。

评论

0赞 Tahlil 12/17/2012
那为什么我需要使用 include?我可以做“include”可以用“使用指令”做的事情,对吧?
1赞 Zeks 12/17/2012
不,你不能。你不能把你没有包含在 #include 中的东西纳入范围。“使用”只允许您使用其他范围的东西,而不完全限定它们。但是范围本身必须是可见的,这就是你使用 #include 的目的
0赞 Tahlil 12/17/2012
您能举例解释一下吗:)谢谢。
0赞 Zeta 12/17/2012
@kalkin:改进了我的答案。
0赞 Tahlil 12/17/2012
因此,要使示例正常工作,我需要“包含”声明命名空间“module”的文件,对吗?