c/c++开发分享错误:没有链接的重新声明

#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++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545944.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注