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

C++ C++;函数前面的外部用法,c++,C++,我在这里看到了彭博社的采访问题: 问题1>它会编译吗 问题2>如果它编译,意味着什么 extern int i; int i; // a function declaration extern void print(int *a, int z); // still a function declaration void print(int *a, int z); 问题3>它会编译吗 问题4>如果它编译,意味着什么 extern int i; int i; // a function dec

我在这里看到了彭博社的采访问题:

问题1>它会编译吗

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

extern int i;
int i;
// a function declaration
extern void print(int *a, int z);
// still a function declaration
void print(int *a, int z);
问题3>它会编译吗

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

extern int i;
int i;
// 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++完全一致,

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

答复1

是的,它编译成功了

答复2

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

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

是的,它编译成功了

答复4

一个是声明,另一个是定义。注意,这个定义没有初始值设定项。对于全局变量,需要显式添加关键字
extern
,以区分声明和定义。它与C++完全一致,


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

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

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

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


同样的规则也适用于第二个。在第一种情况下,它将成功编译。这是你可以参考的链接。由于在这两种情况下,您只声明函数,因此只要只有一个定义,就可以多次声明实体


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

Q1涉及此代码:

extern void print(int *a, int z);
void print(int *a, int z);
extern int i;
int i;
它是否会编译取决于它的位置。例如,在类定义的最外层,它不会编译

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
指定extern链接,表示定义可以在另一个翻译单元中。这是函数的默认值。您的C++教材应该讨论使用<代码>外部> /代码>和<代码>静态< /代码> .< Q3指此代码:

extern void print(int *a, int z);
void print(int *a, int z);
extern int i;
int i;
它是否会再次编译取决于它所在的上下文

Q4。如果它进行编译,那么它将声明一个外部链接变量
i
,并定义该变量(它不能是一个自动定义的局部变量,因为这将以C++不支持的方式重新定义名称
i


干杯,请参见此代码:

extern void print(int *a, int z);
void print(int *a, int z);
extern int i;
int i;
它是否会编译取决于它的位置。例如,在类定义的最外层,它不会编译

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
指定extern链接,表示定义可以在另一个翻译单元中。这是函数的默认值。您的C++教材应该讨论使用<代码>外部> /代码>和<代码>静态< /代码> .< Q3指此代码:

extern void print(int *a, int z);
void print(int *a, int z);
extern int i;
int i;
它是否会再次编译取决于它所在的上下文

Q4。如果它进行编译,那么它将声明一个外部链接变量
i
,并定义该变量(它不能是一个自动定义的局部变量,因为这将以C++不支持的方式重新定义名称
i


干杯&hth.,

你的问题到底是什么?似乎我必须问你同样的问题:)你的问题到底是什么?似乎我必须问你同样的问题:)-1答案1不正确。答案3也不正确。代码是否编译取决于上下文。绝对答案“是”只适用于不同的问题,即是否可以编译。给定上下文,可以假设它们处于全局上下文中。@Erik,请参阅我的答案,以获取Q1代码未编译的示例。@Erik,不,我不会说在特定上下文中进行假设是好的。OP没有说明任何此类背景。在C++中没有“默认上下文”。@阿尔夫,埃里克不是我:好的,我更新了我的答案来涉及我假设的上下文。- 1答案1是不正确的。答案3也不正确。代码是否编译取决于上下文。绝对答案“是”只适用于不同的问题,即是否可以编译。给定上下文,可以假设它们处于全局上下文中。@Erik,请参阅我的答案,以获取Q1代码未编译的示例。@Erik,不,我不会说在特定上下文中进行假设是好的。OP没有说明任何此类背景。C++中没有“默认上下文”。@阿尔夫,埃里克不是我:好的,我更新了我的答案,以涉及我假设的上下文。