gpt4 book ai didi

c++ - 未找到在未命名命名空间内声明的函数的函数定义 - 如何解决? ( Visual Studio 2015)

转载 作者:太空狗 更新时间:2023-10-29 20:38:22 25 4
gpt4 key购买 nike

我安装了 Visual Studio 2015 并发现我的一些代码(在 VS 2013 中没有任何问题)现在出现了一些错误,用绿色波浪线表示(这应该是一个新的生产力功能)。然而代码仍然可以成功编译。

这是一个简单的例子:

namespace
{
void test1(); // what once was OK in VS 2013,
void test2(); // is now marked with squiggles in VS 2015
}

namespace named
{
void test3(); // OK, no problem
}

void test1() { /*...*/ }
void ::test2() { /*...*/ }
void named::test3() { /*...*/ }

int main() { /*...*/ }

这些是有问题的波浪线

enter image description here

将鼠标移到它们上面告诉我

Function definition for 'test1' not found

Function definition for 'test2' not found


事实证明,只有在未命名命名空间内声明的函数才会触发波浪线。

应该如何解决?

最佳答案

绿色波浪线不会告诉您有错误,它们告诉您新的重构工具有机会做一些事情。 (红色波浪线表示错误。)在这种情况下,它们会通知您没有与 test2 的声明相匹配的定义,因此 IDE 会提供生成一个定义。

这恰好指出了代码中始终存在的错误,尽管 Visual Studio 的行为可能不符合规范。

那么会发生什么?问题是未命名命名空间中的声明没有声明您稍后在全局命名空间中定义的相同函数。重构工具认识到这一点,并提供为声明的函数生成定义。

但是,由于 Microsoft 编译器接受了两段严格非法的代码,整个过程仍然可以编译。首先,不允许在函数的第一个声明中使用命名空间前缀。 main 中的代码可能会调用这些函数。正如 Alex M 在他的回答中所展示的那样,GCC 也不会接受这个,因为这个电话是模棱两可的。 Microsoft 编译器似乎接受了它,要么将定义视为与未命名命名空间中的声明匹配的定义(请记住,IDE、IntelliSense 和重构的工具使用更符合 EDG 的前端,而不是解析器实际编译器使用,这意味着重构可以说声明没有定义,而编译器将定义视为匹配声明),或者只是更喜欢全局版本而不是命名空间版本。

顺便说一句,很容易区分这两种情况。重新排列代码,使 main 出现在函数定义之前。这将解决 GCC 中的歧义,因为只声明了命名空间函数(而不是定义,所以你应该得到一个链接器错误)。它还会导致 Microsoft 编译器中的链接器错误,如果它只是更喜欢全局版本,但如果将声明和定义视为匹配,它仍然会编译。

所有这一切的解决方案非常简单:当定义在未命名命名空间中声明的函数时,只需重新打开命名空间而不是尝试在外部定义函数。

关于c++ - 未找到在未命名命名空间内声明的函数的函数定义 - 如何解决? ( Visual Studio 2015),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31900112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com