我从彭博社那里看到了一个面试问题: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>如果它编译,它意味着什么?
答案 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 ++教科书应该讨论使用extern
和static
。
Q3 是指此代码:
extern int i;
int i;
它是否会再次编译取决于它所放置的上下文。
<强> Q4 即可。如果它编译然后它声明一个外部链接变量i
,并定义该变量(它不能是一个自动定义的局部变量,因为这将是一个重新定义名称i
的方式不受C ++支持。
干杯&amp;第h。,
答案 2 :(得分:0)
extern in declaration将分配此compillation单元中所需的内存,并且在链接期间将有一个定义。在一个nushell。
答案 3 :(得分:0)
在第一种情况下,它将成功编译。以下是您可以参考Ideone sample test的链接。由于这两种情况都只是声明函数,只要只有一个定义,就可以多次声明实体。
同样的规则也适用于第二条规则。