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
将具有外部链接。对于更正式的解释,我发现,:在给定的范围内,每个声明声明