【问题标题】:Does extern declaration on static function break internal linkage?静态函数的外部声明会破坏内部链接吗?
【发布时间】:2012-01-18 12:35:05
【问题描述】:

我有一个理论问题。

这是一个例子:

file1.c

static void foo()
{
    ...
}

file2.c

extern void foo(); 

main()
{
    foo();
}

编译正常。

那么,extern 打破了静态声明的内部链接?

【问题讨论】:

  • 什么让你感到惊讶?编译器一次在一个编译单元上工作。链接器可能会抱怨。
  • 另外,您的main 不正确。它可以接受任意数量的参数。
  • 您是否也尝试过链接程序?

标签: c static extern


【解决方案1】:

“编译可以”只是理论上,还是你实际测试过?

static 函数不应从它所在的编译单元(通常是 C 文件)外部可见。

在不同的编译单元中声明与extern 同名的函数不应改变这一点。

确保您确实正确地构建和链接测试程序,否则您要测试的只是您可以对外部符号(foo 函数)进行“悬空”引用参考 2.c)。将 2.c 构建成可执行文件(即链接它)应该会失败。

【讨论】:

    【解决方案2】:

    编译应该没问题。如果你也可以链接,你的编译器有问题。

    【讨论】:

      【解决方案3】:

      快速测试确认预期的链接器故障(VC++ 2010 express):

      1>test.obj : 错误 LNK2019: 函数 _wmain 中引用的未解析的外部符号“void __cdecl foo(void)”(?foo@@YAXXZ)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多