相关疑难解决方法(0)

如何使用extern在源文件之间共享变量?

我知道C中的全局变量有时会有extern关键字.什么是extern变量?宣言是什么样的?它的范围是什么?

这与跨源文件共享变量有关,但这是如何工作的?我在哪里用extern

c global-variables extern

942
推荐指数
13
解决办法
67万
查看次数

822
推荐指数
10
解决办法
35万
查看次数

为什么在嵌套的FOR循环中使用相同的count变量名称有效?

为什么以下不会出错?

for (int i=0; i<10; ++i) // outer loop
{
    for (int i=0; i<10;++i) // inner loop
    {
    //...do something
    }
//...do something else
}
Run Code Online (Sandbox Code Playgroud)

我理解它的方式,大括号({...})中的变量只在这些大括号内.但是内环在外环的支撑内.因此,一旦我声明int i=0内部循环,我不应该得到有关多个定义的错误吗?

c++ scoping

12
推荐指数
1
解决办法
6733
查看次数

为什么 c 和 c++ 以不同的方式对待未初始化变量的重定义?

int a;
int a=3; //error as cpp compiled with clang++-7 compiler but not as C compiled with clang-7;

int main() {

}
Run Code Online (Sandbox Code Playgroud)

对于 C,编译器似乎将这些符号合并为一个全局符号,但对于 C++,这是一个错误。

演示


文件 1:

int a = 2;
Run Code Online (Sandbox Code Playgroud)

文件2:

#include<stdio.h>
int a; 

int main() {
    printf("%d", a); //2
}
Run Code Online (Sandbox Code Playgroud)

作为用 clang-7 编译的 C 文件,链接器不会产生错误,我假设它将未初始化的全局符号“a”转换为外部符号(将其视为被编译为外部声明)。作为使用 clang++-7 编译的 C++ 文件,链接器会产生多重定义错误。


更新:链接的问题确实回答了我的问题中的第一个示例,特别是“在 C 中,如果在同一翻译单元中较早或较晚找到实际的外部定义,则暂定定义仅作为声明。” 和'C++ 没有“暂定定义”'。

至于第二种情况,如果我 printf a,那么它会打印 2,所以显然链接器已经正确链接了它(但我以前假设编译器将临时定义初始化为 0 作为全局定义,并且会导致链接错误)。

事实证明,int i[];两个文件中的暂定定义也与一个定义相关联。int i[5];也是 .common 中的一个暂定定义,只是向汇编器表达了不同的大小。前者称为类型不完整的暂定定义,而后者是类型完整的暂定定义。

C 编译器发生的情况是,int a在 .common 中将其设为强绑定弱全局,并在符号表中 …

c c++ clang language-lawyer clang++

5
推荐指数
1
解决办法
273
查看次数

澄清范围和重新定义

参考下面的代码:

#include <stdio.h>

int a;
int a;

int main()
{
    int b;
    int b;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器(GCC)仅仅为变量'b'而不是'a'抱怨重新声明?

redef.c:在函数'main'中:redef.c:19:错误:重新声明没有链接的'b'

redef.c:18:错误:之前的'b'声明就在这里

c

4
推荐指数
1
解决办法
159
查看次数