extern关键字放到函数体内而导致的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声明在函数体外吧

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值