Tag: 全局变量

C语言标准是否指定了对全局寄存器变量的支持

我读到gcc提供了将全局变量定义为寄存器存储变量的支持。 我想知道的是标准是否有这种支持的任何规范。

在为ARM7编译的C代码中,使用全局变量是增加还是降低性能?

在为ARM7嵌入式平台编译时,在C代码中使用大量全局变量是否会降低或提高性能? 代码库由多个C源代码文件组成,这些文件使用extern关键字引用彼此的全局变量。 来自不同源代码文件的不同函数指的是不同的全局变量。 一些变量是数组。 我正在使用的编译器是IAR的EW ARM kickstart版本(32kb)。

在运行时定义的C ++全局外部常量可用于多个源文件

我有一个在运行时定义的整数常量。 此常量需要在全局和多个源文件中可用。 我目前有以下简化情况: ClassA.h声明了extern const int someConstant; ClassA.cpp在某些时候使用someConstant 。 Constants.h声明了extern const int someConstant; main.cpp包括ClassA.h和Constants.h ,声明const int someConstant ,并且在main()期间的某个时刻尝试在运行时将someConstant初始化为实数值。 这与一个char *常量完美地工作,我使用它来使程序的名称在所有文件中全局可用,并且它的声明和定义与我试图在这里声明和定义的那个完全相同,但我无法得到它使用int 。 我得到第一个error: uninitialized const ‘someConstant’ [-fpermissive]在我在main.cpp声明它的行,后来我得到一个error: assignment of read-only variable ‘someConstant’我认为是error: assignment of read-only variable ‘someConstant’是因为someConstant正在初始化默认值。 有没有办法做我想在这里实现的目标? 提前致谢! 编辑 (根据@WhozCraig的要求):相信我:它是不变的。 我没有发布MCVE的原因是由于三个原因:这是一个任务,源是西class牙语,因为我真的想把问题保持为一般(并且可重复使用)。 我开始写这个例子,中途它打击了我不是最清楚的问题。 我会再试一次解释。 我被要求构建一个程序来创建一个进程,该进程又生成两个孩子(这些孩子反过来会产生两个孩子,依此类推)。 该程序将生成的代数视为单个参数。 基本上创建一种二进制过程树。 每个过程都必须提供有关他自己,他的父母,与原始过程的关系以及他的孩子(如果有的话)的信息。 因此,在上面的示例中, ClassA实际上是一个包含有关进程信息的类(PID,PPID,子PID,与原始进程的关系程度等)。 对于每个fork我创建了这个类的新实例,因此我可以“保存”这些信息并将其打印在屏幕上。 当我定义与原始进程的关系时,我需要知道在调用程序时使用的参数,以检查此进程是否没有子进程(以更改该特定进程的输出)。 这是我需要的main常数:产生的世代数,树的“深度”。 编辑2 :我将不得不道歉,这是漫长的一天,我没有直接思考。 我将源代码从C切换到C […]

如果我在全局范围内声明一个没有大小的数组,我会得到什么?

在C中打高尔夫球技巧 的答案之一中 ,我看到了这段代码(ungolfed版本): s[],t; main(c){ for(scanf(“%*d “); ~(c=getchar()); s[t++]=c) putchar(s[t]); } 我认为上面的节目展示了UB(但谁在关心代码高尔夫?)。 但我不明白的是全局范围内的s[] 。 我知道当未指定全局变量的类型时,它默认为int 。 我创建了一个令人惊讶的编译的小程序: #include int s[]; int main(void) { printf(“Hello!”); } 虽然它发出一个警告: prog.c:23:5: warning: array ‘s’ assumed to have one element [enabled by default] int s[]; ^ 上面的程序是什么? 它是int*还是别的什么? 这在任何地方都有用吗?

是否有工具列出C函数使用和输出的全局变量?

我想列出函数消耗的全局变量/宏以及函数输出。 例如,对于: void myfn(void) { out1 = in + 1; out2 = 2; } ..该工具将输入列为’in’,输出列为’out1’和’out2’。 有谁知道这样的工具?

如何在c语言中的多个源文件之间共享变量及其值?

我有两个名为file1.c和file2.c的源文件(.c)需要在它们之间共享一个变量,这样如果在一个源文件中变量已被更新,那么在访问此变量时,在另一个源文件中更改会被看到。 我所做的是创建另一个名为file3.c的源文件和名为file3.h的头文件(当然,它包含在file1.c file2.c和file3.c中) in file3.c: int myvariable = 0; void update(){//updating the variable myvariable++; } int get(){//getting the variable return myvariable; } in file3.h: extern int myvariable; void update(void); int get(void); in file1.c: . . . printf(“myvariable = %d”,get());//print 0 update(); printf(“myvariable = %d”,get());//print 1 . . . in file2.c: . . . printf(“myvariable = […]

在c中全局定义变量的extern

我有以下源代码,我感兴趣。 #include extern int foo; int foo = 32; int main() { printf(“%d”, foo); } 这是一段非常正常的代码,当我编译它时 gcc -Wall -Wextra -pedantic foo.c 我没有得到任何警告。 这似乎很奇怪,因为变量既被定义为外部变量又被定义为同一文件中的全局变量。 我很确定链接器很容易在同一个文件中找到外部变量的引用,但它看起来不像编码错误吗? 如果是这样,编译器为什么不警告这个呢?

相对于函数调用和返回的全局变量访问

我一直在研究这个主题,但我找不到具体的权威答案。 我希望非常熟悉C规范的人能够回答 – 即确认或驳斥我的断言,最好引用规范。 断言:如果一个程序包含多个编译单元(单独编译的源文件),编译器必须确保在调用另一个单元中的函数之前或从任何函数返回之前将全局变量(如果已修改)写入内存。 此外,在任何函数中,必须在首次使用之前读取全局。 在调用任何函数之后,不是在同一单元中,必须在使用前读取全局。 并且这些事情必须是真的,无论变量是否被限定为“volatile”,因为另一个编译单元(源文件)中的函数可以在没有编译器知识的情况下访问变量。 否则,全局变量总是需要“volatile” – 即非易失性全局变量没有任何意义。 编译器能否在同一编译单元中处理不同于未编译单元的函数? 我在全局变量上找到的“volatile”限定符的所有讨论都显示了同一编译单元中的所有函数。 编辑:编译器无法知道其他单元中的函数是否使用全局。 因此我假设上述条件。 我发现这两个问题与这个主题相关的信息,但他们没有解决它或他们提供我发现怀疑的信息: 函数调用之间是否刷新了全局变量? 我什么时候需要在ISR中使用volatile?

C中的静态变量初始化

可能重复: C中静态变量的初始化 我知道全局变量或静态都是在C中自动初始化为零。但是,我不确定是否只有一个或者只有一个被初始化。 请注意,我不是在讨论函数中定义的变量,而是在.c文件中全局变量。 那么以下哪个变量会自动初始化为零? static struct mystruct var1; struct mystruct var2; static struct { int x; int y; } var3;

C和C ++中的全局变量有什么区别?

我测试了以下代码: 在文件ac / a.cpp中 int a; 在文件bc / b.cpp中 int a; int main() { return 0; } 当我使用gcc * .c -o test编译源文件时,它会成功。 但是当我使用g ++ * .c -o test编译源文件时,它会失败: ccIJdJPe.o:b.cpp:(.bss+0x0): multiple definition of ‘a’ ccOSsV4n.o:a.cpp:(.bss+0x0): first defined here collect2.exe: error: ld returned 1 exit status 我真的很困惑。 C和C ++中的全局变量之间有什么区别吗?