Tag: 全局变量

C有像C ++这样的一个定义规则吗?

最近,我发现有些情况绝对会违反C ++的ODR,但会在C编译器中编译好。 例如,这个奇怪的场景(和我一起): 来源1 int var_global=-3; 来源2 #include #include unsigned int var_global; int main() { printf(“%d \n”,var_global); getch(); return 0; } 我的打印结果是-3 (即使在Source 2中 var_global是unsigned )并且没有关于var_global 重新定义的var_global 。 我知道C与C ++有不同的规则,但我认为它不是那么不同。 我有谷歌并阅读了很多结果,但没有像 C ++ 这样的官方结果。 所以问题是: C有像C ++这样的一个定义规则吗? 和: 什么叫官方? 我需要它与C ++规则进行比较,这样我才能更深入地理解这两种语言。 p / s:我使用Visual Studio 2010编译上面的代码。

C和C ++中的静态变量

在C和C ++之间的任何函数之外声明为static的变量之间是否有任何区别。 我读到static意味着文件范围,并且文件外部不能访问变量。 我还读到在C中,全局变量是static 。 那么这是否意味着C中的全局变量无法在另一个文件中访问?

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

我正在阅读The C Book ,试图在C语言中找到一个更好的基础。虽然我认为我通常会得到指针的概念,但有一点让我觉得它似乎正在推广它指向全局的任何东西。变量(例如,使用指针从void函数返回值的能力),我认为这自然带有所有伴随的危险。 除了指针引用数组中的特定变量或索引之外,指针和全局变量之间的区别是什么?

如何避免全局常量的“多重定义”错误?

我正在使用Windows API编写C程序。 每个主要函数都有自己的文件,原型有一个标题,包括以下内容: // Headers & global constants #pragma once #define _WIN32_LEAN_AND_MEAN #include #include #include #define szClassName TEXT(“EthicsPresentationWnd”) // Prototypes LRESULT CALLBACK WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK FontProc1(HWND hWnd, LPARAM lParam); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); ATOM RegisterWindow(HINSTANCE hInstance); 我很恼火的是#define szClassName行。 我不喜欢使用宏,并且更喜欢使用正确的全局变量wchar_t szClassName[] ,但是如果我这样做,那么链接器会抱怨包含标头的每个模块中的多个定义变量。 我认为#pragma […]

全局变量何时被认为是良好/推荐的做法?

我一直在阅读很多关于为什么全局变量是坏的以及为什么不应该使用它们的原因。 然而,大多数常用的编程语言都以某种方式支持全局变量。 所以我的问题是,仍然需要全局变量的原因是什么,它们是否提供了一些无法实现的独特且不可替代的优势? 与用户指定的自定义间接相比,从本地范围中检索对象时,全局寻址是否有任何好处? 据我所知,在现代编程语言中,全局寻址与计算内存地址的每个偏移量具有相同的性能损失,无论是从“全局”用户存储器的开头偏移还是偏离此处或任何其他指针。 因此,就性能而言,用户可以在使用公共指针间接所需的狭窄情况下伪造全局变量,而不会损失实际全局变量的性能。 还有什么? 真的需要全局变量吗?

最优雅的方式来共享一个C数组

我必须在使用C ++一段时间后回到(嵌入)C,并遇到以下问题: 我有一个包含很多次的源模块,让我们称之为utilities.h和utilities.c在其中,我有一个重要的数组,让我们称它为 #define IMPORTANT_ARRAY_LENGTH 10000 char important_array[IMPORTANT_ARRAY_LENGTH]; 我在这个utilities模块中有很多其他function,它们都可以正常工作。 但是,在其他一个源文件中,我们称之为worker.c ,我必须使用这个数组。 什么是“官方”,优雅的方式来做到这一点,而不必将extern char important_array[IMPORTANT_ARRAY_LENGTH]和宏定义放在worker.c ? 如果我执行以下操作: utilities.h #ifndef _UTILITIES_H_ #define _UTILITIES_H_ #define IMPORTANT_ARRAY_LENGTH 10000 extern char important_array[IMPORTANT_ARRAY_LENGTH]; // … utilities.c #ifndef _UTILITIES_C_ #define _UTILITIES_C_ #include “utilities.h” char important_array[IMPORTANT_ARRAY_LENGTH]; // … worker.c #include “utilities.h” // … important_array[0] = 0; 那么我的数组将是worker.c一个未定义的符号。 如果我不在utilities.h使用extern关键字,那么它当然是一个重复的符号。 (奇怪的是,它只用一个警告编译,我可以从链接器文件中看到大小被多次分配。) 我真的必须在worker.c声明我的数组吗? 我想保持一切干净,并且只在一个地方包含所有声明:在头文件中。 我想只有一次宏定义(这是次要的,因为我可以使用const,但我希望预处理器能够处理它,而不是占用它)

全局变量上的’初始值不是常数’?

因此,在编译以下代码时,我得到’initializer element not constant’错误: #include #include #include float wl = 2.0f; float k = 2.0f * (float) M_PI / wl; int main () { //Do stuff } 如果我在main方法中移动”float k” ,则没有错误,但这对我来说不是一个选项,因为我需要将float k作为全局变量。 即使我改变它: const float wl = 2.0f; const float k = 2.0f * (float) M_PI / wl; 错误仍然发生。 我该如何解决?

线程无法计数,给出错误的结果

我写了这段代码 #include /* Input/Output */ #include /* General Utilities */ #include /* POSIX Threads */ unsigned int cnt=0; /*Count variable%*/ const int NITERS=1000; void count() { int i=0; for(i=0; i<NITERS; i++) { cnt++; } pthread_exit(0); } int main() { pthread_t tid1,tid2; /* create threads 1 and 2 */ pthread_create(&tid1,NULL,count,NULL); pthread_create(&tid2,NULL,count,NULL); /* Main block now waits […]

当存在本地和全局冲突时如何访问全局变量

代码: int a = 33; int main() { int a = 40; // local variables always win when there is a conflict between local and global. // Here how can i access global variable ‘a’ having value ’33’. } 如果你问:为什么有人想做上面的事情? 为什么[a-zA-Z] *? 我的回答是:只知道’有可能这样做’。 谢谢。

C程序中.bss段的模糊行为

我在下面编写了简单的C程序(test.c): – #include int main() { return 0; } 并执行以下内容以了解.bss段中的大小更改。 gcc test.c -o test size test 输出结果如下: – text data bss dec hex filename 1115 552 8 1675 68b test 我没有声明全局或静态范围。 所以请解释为什么bss段大小为8个字节。 我做了以下改变: – #include int x; //declared global variable int main() { return 0; } 但令我惊讶的是,输出与以前相同: – text data bss dec hex filename 1115 […]