2013-01-23 20 views
0

我总是忘记将“静态”前缀添加到我的变量和函数中,因此GCC将它们标记为extern。是否可以更改此行为,以便默认情况下将所有内容标记为静态。这两种类型在运行时是否存在性能差异,还是更形式化?将默认值从Extern更改为静态

+0

您可能需要从编译后的代码中转储符号,以查看是否有任何您已经忘记的静态代码。试试'nm','objdump'和其他类似的工具。 –

回答

5

是否可以更改此行为,以便默认情况下将所有内容标记为静态。

不是我所知。

这两种类型在运行时是否存在性能差异,还是更形式化?

是的,gcc能够在指定对象或函数为static时执行进一步的优化。例如,gcc(即使在-O0中)将内联一个只被调用一次的指定函数static

+0

你知道GCC是否会检测到其他文件中没有使用变量,并在编译时将它威胁为静态?或者我总是需要明确地添加它? – Muis

+0

@Joshua它不会。或者至少不是默认的。较新的'gcc'版本具有链接时间优化:请参阅'gcc'选项'-flto'和'-fwhole-program'。 – ouah

1

首先:extern修饰符是不是默认。该限定符表示提到的项目将在另一个编译单元中定义,因此它仅适用于声明全局变量之类的内容。

没有办法使static修饰符成为默认值,因为没有dynamic修饰符可以取消这个默认值。因此,没有办法用适当的默认值编写工作代码:每个函数和变量都是static,这会导致编译器生成一个空的输出文件!

这两种类型在运行时是否存在性能差异,还是更形式化?

编译器可以对static函数和变量执行一些优化,而这些函数和变量不能在动态函数上执行。特别是,从未引用的函数和变量可能会完全丢弃,并且static函数可以更积极地内联。

+0

如果extern不是默认的,那么默认是什么? – Muis

+0

默认值是无(即没有修饰符)。静态变量没有链接 - 它们不能从其他文件中引用。 – duskwuff

+0

那么'没什么'和extern之间有什么区别呢?因为它听起来像他们提供相同的。看起来很奇怪,默认情况下没有选择使用静态的选项,因为与其他文件相比,我需要全局变量的时间比我需要静态的时间要少得多。希望GCC足够聪明地在编译时注意到变量不在其他地方使用,并将其编译为静态。 – Muis