我认为您对 的含义static
和const
可以理解的含义感到困惑,因为您(和我!)一旦阅读了该理论,就经常忘记它们的含义。
1) 首先,const
。这const
意味着我们不会通过对它的“引用”来改变变量的值。这对于函数参数非常有用,尤其是在使用指针时,这样您就不会编辑您不打算编辑的值。例如,任意:
void add(int* result, const int* a, const int* b)
这个声明意味着如果我们不小心输入a = result + b;
了编译器应该抱怨并拒绝编译。在这种情况下,我们以这样一种方式命名变量,即使意外我们也不应该覆盖它们,但在更复杂的情况下,它可能会发生。
然而,正如 pmg 所说,这并不意味着该值不会改变;它只是意味着在谈论该地址/值的这个版本时,我们不会更改它。我的观点是,保护您不打算更改的参数很有用,以防您不小心尝试更改它们。如果您想要一个真正的固定值预处理器,通常会使用,例如#define TRUE 1
.
2) 现在static
。静态的意思是“在这个编译单元之外不可见”。这就像,我强调,但不等同于类中私有的概念,但在这种情况下,我们谈论的是整个 C 文件。所以,如果我们在文件中helloworld.c
并且在顶部你写:
static int x = 10;
然后,您不能使用该版本的x
in helloworld2.c
。
3)虽然我们在做,但我们不妨换个说法inline
。inline
在我看来,这是一种更好的宏处理方式,意思是“编译器,你应该把它的结果代码放在你调用它的任何地方,而不是让我们花费一个函数调用”。无论如何,优化编译器可能会这样做,但这充当了尽可能内联的显式指令。
总之,这些特性都控制语言的所有部分,而不是变量在可执行文件的各个段中的位置。正如pmg所说,编译器可以做任何它喜欢的事情。
如果您想了解编译器做了什么,请使用gcc -S
. 这为您提供了gcc
AT&T 格式的汇编语言输出。尝试使用不同的gcc -Ox
wherex=0,1,2,3
标志来了解优化的工作原理。
最后,值得注意的是,其实a.out
只是一个名字;您的现代内核可能是在不支持a.out
二进制文件的情况下编译的。
我想这就是你真正想问的问题。