#include int x=13; // forcing space allocation int x; int main(){ printf("%dn",x); }
上面的代码编译但下面的代码没有编译。 为什么?
#include int main(){ int x=13; // forcing space allocation int x; printf("%dn",x); }
我被告知int x; 可以由编译器将其解释为声明或定义,具体取决于上下文。 我可以在第一种情况下看到(全局一种),但在第二种情况下会发生什么。
引用:
在C程序中,不能有两个具有相同名称的全局变量。 C可能允许通过暂定定义规则在同一文件范围中进行多个定义,但无论如何所有定义都将引用相同的变量。
因为您不能声明两次具有相同名称的局部变量。 根本不要那样做。
它适用于全局的,因为编译器将其视为前向声明 ,当然这不能用于堆栈变量。
请注意,只有在未分配值时,它才能全局工作。
继续你的评论:“你能详细说明前瞻性声明”……
前向声明正是他们听起来的样子。 将在其他地方(通常是稍后)定义的声明。 此概念仅适用于全局符号。 在结果二进制文件中只能有一个全局符号的定义。 但是,您可以在源代码中反复声明它们,以便在编译阶段可以引用它们。
这些符号在汇编中成为定义,然后用于在链接阶段将所有内容链接在一起。
头文件是在代码中其他地方(稍后)定义的前向声明的常用示例。
本地(自动)变量不会转换为符号。 所以,当你说出类似的话
int x; int x;
在相同的范围内,编译器不允许它,因为它是无意义的。 局部变量只是指向函数堆栈帧中特定位置的便利。 它们的定义边界在范围标记{
}
。
头文件本质上是全局变量和函数的“前向声明”; 在struct foo;
为你看这个struct foo;
。
如果您希望看到全局定义导致错误,请尝试。 int x = 10;
int x = 11;
作为一个全局,你会看到编译器向“redifintion of x”效果吐出一个错误。
以上就是c/c++开发分享错误:没有链接的重新声明相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/545944.html