c++用法:extern在函数前面

C++ usage extern in front of function

本文关键字:函数 前面 extern 用法 c++      更新时间:2023-10-16

我在这里看到了彭博社的采访问题: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>如果它可以编译,这意味着什么?

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

是,编译成功。

回答2

不带{}体的全局函数自动为函数声明。extern为可选关键字。所以它们都只是声明。多重声明也可以。

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

3

是,编译成功。

一个是声明,另一个是定义。注意,这个定义没有初始化设定项。对于全局变量,需要显式地添加关键字extern来区分声明和定义。它完全符合c++中的一个定义规则。

Edit:我无法打开那里的链接。我假设您提到的代码是在全局上下文中。

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;

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

第四季度。如果它编译,那么它声明一个外部链接变量i,并定义该变量(它不能是一个自动定义的局部变量,因为那将是对名称i的重新定义,而c++不支持这种方式)。

干杯,hth。

extern in声明将分配该编译单元所需的内存,并且在链接期间将有一个定义。简而言之。

在第一种情况下,它将成功编译。这里有一个链接,你可以参考ideone的样本测试。因为在这两种情况下你都只是声明函数,所以只要只有一个定义,就可以多次声明实体。