首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数前面的C++用法外部

函数前面的C++用法外部
EN

Stack Overflow用户
提问于 2011-08-12 11:42:55
回答 4查看 1.1K关注 0票数 1

我在这里看到了彭博社的面试问题:http://www.careercup.com/question?id=383154

代码语言:javascript
复制
extern void print(int *a, int z);
void print(int *a, int z);

问题1>它会被编译吗?

问题2>如果它被编译了,那是什么意思?

代码语言:javascript
复制
extern int i;
int i;

问题3>它会被编译吗?

问题4>如果它被编译了,那是什么意思?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-12 11:51:39

代码语言:javascript
复制
// a function declaration
extern void print(int *a, int z);
// still a function declaration
void print(int *a, int z);

答案1

是的,它编译成功。

答案2

没有主体{}的全局函数自动成为函数声明。关键字extern是可选的。所以它们都只是声明。多个声明就可以了。

代码语言:javascript
复制
// a variable declaration
extern int i;
// a variable definition without an initializer
int i;

答案3

是的,它编译成功。

答案4

一个是声明,另一个是定义。请注意,此定义没有初始化器。对于全局变量,您需要显式添加关键字extern来区分声明和定义。它完全符合C++中的One Definition Rule

编辑:我无法打开那里的链接。我假设您提到的代码是在全球范围内的。

票数 5
EN

Stack Overflow用户

发布于 2011-08-12 11:59:46

Q1引用以下代码:

代码语言:javascript
复制
extern void print(int *a, int z);
void print(int *a, int z);

它是否会编译取决于它放在哪里。例如,在类定义的最外层,它将不会编译。

代码语言:javascript
复制
struct X
{
    extern void print(int *a, int z);   // invalid storage class for a class member by vs2010
    void print(int *a, int z);
};

int main()
{}

Q2.extern指定外部链接,这表示定义可以在另一个翻译单元中。这是函数的默认设置。你的C++教科书应该讨论externstatic的用法。

Q3引用以下代码:

代码语言:javascript
复制
extern int i;
int i;

它是否会再次编译取决于它所在的上下文。

Q4.如果编译成功,则说明它声明了一个外部链接变量i,并定义了该变量(它不能是定义的自动本地变量,因为这将是以C++不支持的方式重新定义名称i )。

干杯&哈。

票数 1
EN

Stack Overflow用户

发布于 2011-08-12 11:53:11

声明中的extern将分配这个比较单元所需的内存,并且在链接期间会有一个定义。在一个玉米壳里。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7035362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档