码迷,mamicode.com
首页 > 其他好文 > 详细

04. 命名空间,函数重载,内联

时间:2020-05-08 09:58:55      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:ali   alt   指示   one   嵌套   ima   ext   图片   个数   

一.命名空间

C语言中为避免冲突,可能采用

项目名_模块名_名字 的形式,缺点是冗长

C语言中作用域:块,局部(函数),文件,全局

C++有采用命名空间

用法1:using namespace MyNamespace;

namespace MyNamespace {
    //可以做所有能在全局作用域中做的事
    int val = 9;//全局
    void f() {

    }
    struct MyStruct {
        int age;
        double score;
    };
}

using namespace MyNamespace;

int main() {   
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}

int Foo() {
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}

  

如果把using namespace MyNamespace;放在函数内部,则只在该函数内可见。

int main() {   
    using namespace MyNamespace;//把整个命名空间的所有名字导入当前作用域
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}

int Foo() {
    //本函数无法使用以下内容,编译出错
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}

  

用法2:

int main() {     
    MyNamespace::val = 100;
    MyNamespace::f();
    MyNamespace::MyStruct str{ 1,1.1234 };
    return 0;
}

  

用法3:

using MyNamespace::val;//把MyNamespace的val导入当前作用域
using MyNamespace::f;
using MyNamespace::MyStruct;

int main() {       
    val = 100;
    f();
    MyStruct str{ 1,1.1234 };
    return 0;
}

  

命名空间可以不连续,可以写在多个文件中,例如:

namespace MyNamespace {
    //可以做所有能在全局作用域中做的事
    int val = 9;//全局
    void f() {

    }
    struct MyStruct {
        int age;
        double score;
    };
}

namespace MyNamespace {
    //可以做所有能在全局作用域中做的事
    double foo = 9;//全局
    void g() {

    }
}

  

命名空间可以嵌套:

namespace MyNamespace1 {
    namespace MyNamespace2 {
        namespace MyNamespace3 {
            int age = 100;
        }
    }
}

int main() {
    MyNamespace1::MyNamespace2::MyNamespace3::age = 0;
    return 0;
}

  

命名空间可以取别名:

namespace MyNamespace1 {
    namespace MyNamespace2 {
        namespace MyNamespace3 {
            int money = 100;
        }
    }
}

namespace Space = MyNamespace1::MyNamespace2::MyNamespace3;//取个别名,和命名空间原来的名字等价
using namespace Space;
int main() {
    money = 0;
    return 0;
}

  

using 指示可能会造成冲突:

namespace MyNamespace {
    //可以做所有能在全局作用域中做的事
    double foo = 9;//全局
    void f() {

    }
}

using namespace MyNamespace;
void f() {}


int main() {
    //f();//二义性,编译器可以看见两个f(),不知道调用谁
    MyNamespace::f();//明确指定调用MyNamespace的f()
    ::f();//明确指定调用全局命名空间的f()
    return 0;
}

  

 

一.函数重载

C语言中函数不能同名

C++可以重载函数

构成函数重载的条件:

1.作用域相同

2同名函数

3参数列表不同,参数类型、个数、位置任意一个不同均可

3.1参数类型不同

void f(int) {}

void f(double) {}

3.2参数个数不同

void f(int) {}

void f(int, int) {}

3.3参数位置不同

void f(int, double) {}

void f(double, int) {}

4.返回值和调用约定没有效果

C函数编译后基本只保存了函数名,无法重载。

C++处理函数时,会将作用域,函数名,参数列表,返回值,调用约定等都保存起来。

打开开发人员命令行工具,探索vs的名称粉碎,输入undname可解析函数签名,例如:

技术图片

 

 头文件中如下写,可以实现C调用C++,或者C++调用C:

#pragma once
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

int myadd(int a, int b);


#ifdef __cplusplus
}
#endif // __cplusplus

04. 命名空间,函数重载,内联

标签:ali   alt   指示   one   嵌套   ima   ext   图片   个数   

原文地址:https://www.cnblogs.com/Nutshelln/p/12848271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!