在函数前面的C ++用法extern

时间:2011-08-12 03:42:55

标签: c++

我从彭博社那里看到了一个面试问题:http://www.careercup.com/question?id=383154

extern void print(int *a, int z);
void print(int *a, int z);

问题1>它会编译吗?

问题2>如果它编译,它意味着什么?

extern int i;
int i;

问题3>它会编译吗?

问题4>如果它编译,它意味着什么?

4 个答案:

答案 0 :(得分:5)

// a function declaration
extern void print(int *a, int z);
// still a function declaration
void print(int *a, int z);

回答1

是的,它编译成功。

回答2

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

// a variable declaration
extern int i;
// a variable definition without an initializer
int i;

回答3

是的,它编译成功。

回答4

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

修改:我无法在那里打开链接。我假设你提到的代码是在全局环境中。

答案 1 :(得分:1)

Q1 是指此代码:

extern void print(int *a, int z);
void print(int *a, int z);

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

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 是指此代码:

extern int i;
int i;

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

<强> Q4 即可。如果它编译然后它声明一个外部链接变量i,并定义该变量(它不能是一个自动定义的局部变量,因为这将是一个重新定义名称i的方式不受C ++支持。

干杯&amp;第h。,

答案 2 :(得分:0)

extern in declaration将分配此compillation单元中所需的内存,并且在链接期间将有一个定义。在一个nushell。

答案 3 :(得分:0)

在第一种情况下,它将成功编译。以下是您可以参考Ideone sample test的链接。由于这两种情况都只是声明函数,只要只有一个定义,就可以多次声明实体。

同样的规则也适用于第二条规则。