zoukankan      html  css  js  c++  java
  • XCode学习C++(五、函数的重载和extern “C”)

    一:函数的重载

    什么叫重载?

    在相同的作用域内,如果2个函数的名字相同,而参数列表不同,就称为“重载”

    函数重载的形式

    形参数量不同

    比如 void test(int a) 和 void test(int a, int b)

    形参类型不同

    比如 void test(int a) 和 void test(double a)

    … …

    需要注意的是,下面的情况不属于重载

    void test(int a) 和 void test(int b) 并不构成重载,它们代表的是同一个函数

    void test(int a) 和 int test(int a) 也不能构成重载

    二:函数重载的实现原理

    C++之所以支持函数重载,是因为编译器对每个函数的名称进行了改编

    假设某个函数的原型是:void foo( int x, int y );

    该函数被C编译器编译后在符号库中的名字为_foo

    而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)

    _foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的

    也就是说,在C++中,函数void foo( int x, int y )与void foo(int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。

    三:extern “C”

    extern “C”的最大作用就是实现CC++混合编程,比如CC++的函数互调

    注意:extern后面必须是大写的C

    被extern “C”修饰的变量和函数是按照C语言方式编译和连接的

    也就是说extern “C” void test(int a, int b)被编译器产生的函数名就是_test,不再是类似_test_int_int之类的名称

    下面的写法是等价的:

    extern "C" void test(int a, int b);

    extern "C" void test2(int a, int b);

    等价于

    extern "C"

    {

        void test(int a, int b);

        void test2(int a, int b);

    }

    由于C语言不支持extern “C”的语法,所以严谨起见,一般C++头文件的函数声明会这么写:

    #ifdef __cplusplus

    extern "C"

    {

    #endif

    void test(int a, int b);

    void test2(int a, int b);

    #ifdef __cplusplus

    }

    #endif

  • 相关阅读:
    Building a Space Station POJ
    Networking POJ
    POJ 1251 Jungle Roads
    CodeForces
    CodeForces
    kuangbin专题 专题一 简单搜索 POJ 1426 Find The Multiple
    The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool
    The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold'em Poker
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
    robotparser (File Formats) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/luseike/p/4383322.html
Copyright © 2011-2022 走看看