zoukankan      html  css  js  c++  java
  • externkeyword放到函数体内而导致的linkage问题

    不少人都知道,C/C++语言编程时,假设要引用在别的C/C++文件里定义的变量或函数,必须extern一下,才干使用


    另一些人知道,这个extern事实上能够放在函数体内声明,这么做的理由是不想让其它无关函数訪问extern对象,比如

    void setOldClock()
    {
        sysTime = 87654321;
    }
    
    void setClock()
    {
        extern int sysTime;
        sysTime = 12345678;
    }

    假设sysTime声明在函数体外,则setOldClock也会改动该变量,这一般是不想看到的。


    那么问题来了,假设引用是跨语言的呢?


    这里有篇MSDN的文章,讲得比較具体,但对于函数体内声明的场景没有涉及。

    事实上,假设是C++引用C的对象,一定不能在函数体内extern,

    void setClock()
    {
        extern "C" int sysTime;
        sysTime = 12345678;
    }


    上面的代码gcc编译器会报错:

    error: expected unqualified-id before string constant

    gcc将“C"看做字符串常量,而不是linkage directive,进而导致后面的

    error: 'sysTime' was not declared in this scope

    所以,对于C++调C对象的场景,还是把extern声明在函数体外吧


  • 相关阅读:
    flutter 布局
    常见错误
    xpath
    bzoj1485 [HNOI2009]有趣的数列 卡特兰数
    博弈 Nim问题 POJ2234
    bzoj 1014 [JSOI2008]火星人prefix
    codevs 1743 反转卡片 rope or splay
    bzoj 2326 矩阵乘法
    bzoj 1702 贪心,前缀和
    bzoj 1700 Problem Solving 解题 dp
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4264085.html
Copyright © 2011-2022 走看看