C++ 如果在函数中使用extern声明呢?

C++ 如果在函数中使用extern声明呢?,c++,C++,我尝试了以下代码,但出现了一个错误 int main() { //this will cause redefinition error extern int x; int x=2; } 我已经看到了一些关于外部的答案,比如 得到了一个概念,但我仍然想知道编译器在这种情况下做什么。extern是否可以在某些函数中使用(合法) 更新: 更具体地说,既然extern int x只是一个声明,为什么我不能定义int x?编译器是否将extern int x作为定义?当然可

我尝试了以下代码,但出现了一个错误

int main()
{
    //this will cause redefinition error
    extern int x;
    int x=2; 
}
我已经看到了一些关于外部的答案,比如

得到了一个概念,但我仍然想知道编译器在这种情况下做什么。extern是否可以在某些函数中使用(合法)

更新:


更具体地说,既然
extern int x
只是一个声明,为什么我不能定义int x?编译器是否将
extern int x
作为定义?

当然可以使用,不要在函数中定义另一个
x

int main()
{
    extern int x;
    x=2; 
}

当然可以使用,不要在函数中定义另一个
x

int main()
{
    extern int x;
    x=2; 
}
但是我仍然想知道编译器在这种情况下做什么。extern是否可以在某些函数中使用(合法)

它可以,但不能像在代码中那样重新声明变量。这是一个有效的例子:

int main()
{
    //this will cause redefinition error
    extern int x;
    x=2; 
}

int x; 
但是我仍然想知道编译器在这种情况下做什么。extern是否可以在某些函数中使用(合法)

它可以,但不能像在代码中那样重新声明变量。这是一个有效的例子:

int main()
{
    //this will cause redefinition error
    extern int x;
    x=2; 
}

int x; 

正如其他人所回答的,是的,只要不声明另一个同名变量,就可以在函数中使用它

对于编译器的功能,dreamlax对于您链接的问题处理得非常好。编译器不需要做/知道它的类型以外的任何事情,以便知道如何使用它。链接器将看到它是一个extern,并且知道它需要找到它实际声明的位置


MSDN link提供了更多有关外部变量以及Microsoft在VS 2015中所做工作的一般信息。

正如其他人所回答的,是的,您可以在函数中使用它,只要您不使用该名称声明另一个变量

对于编译器的功能,dreamlax对于您链接的问题处理得非常好。编译器不需要做/知道它的类型以外的任何事情,以便知道如何使用它。链接器将看到它是一个extern,并且知道它需要找到它实际声明的位置



MSDN链接提供了更多有关外部设备以及微软在VS 2015中所做工作的一般信息。

extern int x
;声明具有静态存储持续时间的
x
;然后
intx=2
尝试声明具有自动存储持续时间的
x
,这是error@M.M尽管我不完全理解您的意思,但我尝试使用
static int x=2
而不是
int x=2
,它仍然会给出错误。然后是另一个错误,使用不同的链接重新定义
x
;声明具有静态存储持续时间的
x
;然后
intx=2
尝试声明具有自动存储持续时间的
x
,这是error@M.M尽管我不完全理解您的意思,但我尝试使用
static int x=2
而不是
int x=2
,它仍然会给出错误。然后是另一个错误,使用不同的链接重新声明
x
,这将导致链接错误。INTX无法解析。显然,您需要在另一个翻译单元中定义x,否则您使用extern的目的是什么?是的,我知道这种代码没有意义。我只是好奇编译器如何处理这种情况以及原因。这将导致链接错误。INTX无法解析。显然,您需要在另一个翻译单元中定义x,否则您使用extern的目的是什么?是的,我知道这种代码没有意义。我只是好奇编译器如何处理这种情况及其原因。我不明白为什么这是一个重新定义
extern
只是一个声明。@lionel你是对的,它相当于重新声明(我会修复它)<代码>整数x=2既是声明又是定义,所以如果以前有
extern int x在同一范围内,然后
intx=2将是重新声明。重新声明不会导致任何问题。变量可以声明多次,但只能根据C++引物定义一次。@莱昂内尔更多地是关于变量声明的链接的改变,我认为CLAN给出了一个更好的错误消息:<代码>错误:“X”的非外部声明遵循外部声明< /代码>。这意味着:
intx=2
没有链接,但在
externintx之前
声明
x
将具有外部链接。对于更正式的解释,我发现:
在给定的范围内,每个声明相同的变量名或函数名的相同重载都意味着相同的链接
。然后,如果我在另一个cpp文件中定义了
intx
,那么这个本地
externintx
将链接到它。同时,我只能在
main
函数中使用此
x
,不能在
main
范围中定义另一个
int x
。我说的对吗?我不明白为什么这是一个重新定义
extern
只是一个声明。@lionel你是对的,它相当于重新声明(我会修复它)<代码>整数x=2
既是声明又是定义,所以如果以前有
extern int x在同一范围内,然后
intx=2将是重新声明。重新声明不会导致任何问题。变量可以声明多次,但只能根据C++引物定义一次。@莱昂内尔更多地是关于变量声明的链接的改变,我认为CLAN给出了一个更好的错误消息:<代码>错误:“X”的非外部声明遵循外部声明< /代码>。这意味着:
intx=2
没有链接,但在
externintx之前
声明
x
将具有外部链接。对于更正式的解释,我发现,:
在给定的范围内,每个声明声明