【问题标题】:Why gcc gives error of unused variable for local variables but not for global variables?为什么 gcc 会为局部变量而不是全局变量给出未使用变量的错误?
【发布时间】:2009-03-19 23:14:45
【问题描述】:

我有一个关于 gcc 的问题。为什么当我在函数中本地定义变量时出现未使用变量的错误,而当变量在唯一文件中是全局变量时却没有?

我可以理解它可以用于其他人,但要做到这一点,我需要把外部词正确吗?

提前致谢。

【问题讨论】:

    标签: gcc global local


    【解决方案1】:

    编译器无法知道是否使用了全局变量 - 例如,它可以从用完全不同的语言编写的编译单元中使用。

    【讨论】:

    • 但是为了让它可见,我需要将它声明为外部的吗?。
    • 不,默认是可见的。 External 在其他编译单元中用于指示链接器在其他地方查找全局。
    • 不,只是不要将其声明为静态。如果您想要警告,请将其设为静态。
    • 只需要在使用变量的模块中声明extern即可,不一定是定义变量的模块。
    【解决方案2】:

    如果“全局在一个唯一文件中”,你的意思是 "int x;" 在任何函数之外,编译器的工作不是检测到,如果另一个编译单元需要它,该变量需要对链接器可用(比如errno)。

    如果您的意思是 "static int x" 链接器无法使用它,这可能只是 GCC 做出的选择。我不认为编译器需要通知这一点,除了在您的地址空间中浪费几个字节之外,它并没有真正的损害。

    【讨论】:

      【解决方案3】:

      因为全局变量可以用在编译器不知道的任何其他地方。例如在外部库或程序上。

      【讨论】:

        【解决方案4】:

        未使用的局部变量可以由编译器确定。未使用的全局变量只能由链接器确定,因为它们可以跨对象文件共享。

        一般来说,链接器不会对代码生成发出警告。

        【讨论】:

        • 一般来说,如果链接器要对未使用的全局变量做任何事情,它会将它们从图像中删除。
        【解决方案5】:

        当变量是全局变量时,编译器无法完全了解项目中的所有编译单元 - 变量可以在另一个编译单元中修改。链接器能够判断它未使用,可能会将其从目标文件中删除。

        【讨论】:

        • 我从未遇到过从目标文件中删除内容的链接器。从最终的可执行文件,也许。
        【解决方案6】:

        因为如果它是全局的,它可以被稍后链接的另一个模块使用。

        将所有全局变量定义在一个文件中是一种常见的习惯用法。该文件甚至可能没有任何代码,更不用说使用所有变量的代码了。

        【讨论】:

          【解决方案7】:

          我在android2.3中构建dalvikVM时遇到了同样的问题,我得到了重点。是因为编译器的参数太严格了:

          LOCAL_CFLAGS += -Werror

          【讨论】:

            猜你喜欢
            • 2021-06-20
            • 2022-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-05
            • 1970-01-01
            • 2017-09-20
            相关资源
            最近更新 更多