Tag: static

为什么main()不能在C中声明为静态?

为什么main必须被声明为具有外部链接? 为什么它不应该是静态的? 什么是外部联系?

c / c ++中的静态指针默认值

由于没有赋值的静态变量声明在代码的BSS部分。 它将自动初始化为零。 问题:假设,如果声明静态指针没有任何赋值,那么它的地址或值是否应该为零?

如何在C中用malloc初始化静态指针?

我正在尝试在C中使用malloc启动静态变量(在函数内部),但我得到的是“初始化程序不是常量错误”。 我知道我不能在C中使用非常量启动静态,但是有人能想到解决方案吗? 我需要代码具有与此相同的效果: static int *p = (int *)malloc(sizeof(int)); 有诀窍/解决方法吗? 编辑:我有一个函数,每次标志变高时调用。 在这个函数中,我正在创建并启动一个新线程。 我声明了一个指向结构的指针,并使用malloc分配内存,然后将此指针传递给线程。 然后该函数返回控制。 当我重新进入函数时,我最初打开的线程仍将运行,我希望能够访问我最初传递给线程的内存区域。 这就是为什么我需要一个静态,以便我可以在第一次调用时使用malloc,然后在后续调用中使用相同的地址。 这样我就可以从线程中获取信息。 这一切都是为了避免使用全局变量。

从一个文件访问静态变量到另一个文件

我最近遇到过如何访问一个在file1.c中声明为static的变量到另一个file2.c的问题? 是否可以访问静态变量? 我对C中静态关键字的理解是, static是“内部链接”,因此只能从一个编译单元访问它们 – 它们是定义它们的单元。 使用内部链接声明的对象是单个模块的私有对象。 正如我的一位朋友建议我解决方案。 在file1.c #include int main() { int b=foo(); printf(“%d”,b); return 0; } 在file2.c static int a=25; int foo() { return a; } 由gcc file1.c file2.c -o file编译 如果我在上面,我可以访问变量。 所以我的问题是: 上述程序是否违反静态变量规则? 如果没有,为什么会这样,除了包含文件( #include )之外,还有其他方法可以访问静态变量。 我怎么能从另一个文件访问静态变量? 在C中,如何将全局变量的范围限制为声明它的文件? 如果我对静态变量概念有误,并且有更好的解决方案可用于访问静态变量,请纠正我?

当我们以相同的代价获得全局变量时,静态局部变量的用途是什么?

在C中,当外部变量以相同的成本服务于其目的时,静态存储类的用途是什么。 两者都占用了可执行文件数据段中的存储空间。 我有更好的外部变量范围。如果我希望外部变量的范围是特定文件,我不要声明这个变量else where.i看到很多灵活性与全局变量静态局部变量 如果我们有变量的地址,我们可以引用函数外部的局部静态变量。本地静态变量的存储区将在数据段中不在函数的堆栈框架中。所以静态存储类带来的独特特性表。 我只是想知道静态是否有任何我不知道的微妙目的。

C中的Static,define和const

我已经读过,当每次调用函数时不希望变量值改变/初始化时,静态变量在函数内部使用。 但是如何在“main”之前在主程序中定义变量static,例如 #include static double m = 30000; int main(void) { value = m * 2 + 3; } 这里变量m具有一个常数值,以后不会在主程序中修改。 在同一思路中,它有什么不同,而不是使用静态定义: const double m = 30000; 要么 #define m 30000 //m or M 然后确保在主代码中使用双重操作,以便将m转换为正确的数据类型。

可以在.h文件中声明静态全局变量吗?

static关键字将全局变量的范围限制为该转换单元。 如果我在.h文件中使用static int x并且每隔一个文件包含该.h文件,它们是否都属于同一个翻译单元? 那么,到处都不会看到x吗? 那么静态的作用是什么? 另外,有没有使用static const int x ,其中x是一个全局变量? 默认情况下,并非所有const全局变量都是静态的 并且const变量的范围仅限于TU,即使它被限制在文件中的for循环中?

默认情况下全局变量是extern还是等于在全局中使用extern声明变量?

我经历了两个问题, C和C ++中的静态和外部全局变量 C中的全局变量是静态的还是不是? 这两个问题以不同的方式说明了这两件事。 问题1的答案: Global variables are not extern nor static by default on C and C++. 问题2的答案: If you do not specify a storage class (that is, the extern or static keywords), then by default global variables have external linkage 我需要知道以下内容。 默认情况下,全局变量是extern在链接(或)中它是否相当于通过指定extern存储类来声明变量? 2.默认情况下,全局变量在范围(或)中是静态的,它等同于通过指定静态存储类来声明变量? 3.如果有任何c或c ++差异请澄清?

C和C ++中静态变量初始化的区别

我正在浏览http://geeksforgeeks.org/?p=10302上的代码 #include int initializer(void) { return 50; } int main() { static int i = initializer(); printf(” value of i = %d”, i); getchar(); return 0; } 此代码不会在C中编译,因为静态变量需要在main()启动之前初始化。 那样就好。 但是这段代码在C ++编译器中编译得很好。 我的问题是,当静态在两种语言中使用相同时,它在C ++编译器中编译的原因。 当然编译器对于这些语言会有所不同,但我无法确定原因。 如果在标准中指定,我很想知道。 我在SO上搜索了这个问题,找到了3个相似的链接但是徒劳无功。 Link1 Link2 Link3 谢谢你的帮助。

GCC动态链接libc static和其他一些库,重新访问?

以下问题是相关的,但不回答我的问题: 在GCC中链接部分静态和部分动态 将动态库链接到链接到其他静态库的静态库 GCC:静态链接只有一些库 gcc中共享库函数的静态链接 我之前提出了一个非常类似的问题,但是由于我开始的上一个问题在评论部分有些混乱而没有得到完全回答(但我将其标记为已回答,因为这是一项很好的努力并且至少部分地回答了它)我会问一个新问题。 问题是具体如何将libc链接为静态,同时动态链接其他库(例如libm)。 有人提出在第一个问题中无法做到,是真的吗? 如果是这样,那么知道为什么不是非常有趣。 甚至可以这样做吗? 有人发表评论(由于某种原因被删除,可能是不正确的?)这是可能的,但必须存在动态链接版本的libc,因为动态库需要它(例如动态libm将需要动态libc(?))。 这对我来说很好,但对我来说如何告诉GCC这样做并不明显,即在libc中链接为静态和动态。 我该怎么做(我做了几次尝试,有些会在后面的问题中展示)? 或者还有其他方法可以做我想要的吗? 我们首先看到通过简单地运行gcc test.c -lm,所有内容都是动态链接的,如下所示: $ gcc test.c -lm $ ldd a.out linux-vdso.so.1 (0x00007fffb37d1000) libm.so.6 => /lib64/libm.so.6 (0x00007f3b0eeb6000) libc.so.6 => /lib64/libc.so.6 (0x00007f3b0eb10000) /lib64/ld-linux-x86-64.so.2 (0x00007f3b0f1b0000) 要仅将libm链接为静态,同时允许libc保持动态,我们可以这样做(正如Z boson在前面提到的一个问题中指出的那样): $ gcc test.c /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libm.a $ ldd a.out linux-vdso.so.1 (0x00007fff747ff000) libc.so.6 => /lib64/libc.so.6 (0x00007f09aaa0c000) /lib64/ld-linux-x86-64.so.2 (0x00007f09aadb2000) 但是,尝试链接libc static和libm动态的相同过程似乎不起作用: […]