看看'some symbol'的先前定义

时间:2009-06-18 05:46:55

标签: c++ visual-studio

用c ++编程时, 大多数时候我得到'某个符号'已经被定义了 参见先前对'某些符号'的定义

我认为这是因为包含了不正确的头文件顺序。

我怎样才能找到'某些符号'的所有定义

提前致谢, 乌代

编辑:

我正在使用visual studio 我记得一些命令像dumpbin / exports(我不记得确切)得到所有的定义

7 个答案:

答案 0 :(得分:7)

这通常是由于一些常见问题而发生的:

  • 您正在重新定义相同的符号
  • 您多次包含头文件,并且没有包含警卫
  • 您错误地向前声明了不兼容的类型,然后包括

我会开始尝试修复第二个问题。确保所有标题都包含防护,这样如果您从不同的地方包含它们,它将不会尝试重新定义符号:

#ifndef HEADER_FILE_NAME_GUARD // or something alike
#define HEADER_FILE_NAME_GUARD
// rest of file
#endif

如果您需要订购包含,那么您将在以后遇到麻烦,确保您可以并且确实在所有地方包含所有依赖项。 (或者如果可以的话,转发声明)

答案 1 :(得分:4)

全文搜索是最跨平台的跨环境和高效技术。

答案 2 :(得分:2)

如果你使用安装了Visual Assist的Visual Studio,alt-G会弹出一个列出所有定义内容的地方。

答案 3 :(得分:2)

如果您使用安装了Visual Assist的Visual Studio,最好按Alt + X,然后按D查看符号的所有引用

答案 4 :(得分:2)

将C ++翻译成executbale有两个步骤。在第一步中,编译器通过输入线性工作(通常是.cpp文件和它们包含的头文件)。在步骤2中,链接器组合了步骤1的结果。

从“之前定义的符号”的描述中,我得出结论,问题必须发生在.cpp文件中,因为它们是线性处理的。 dumpbin / exports适用于步骤1的输出,您可能不会这样做。标题包含可能是罪魁祸首,因为这是编译的早期阶段。您想要预处理的输入。 IIRC,你可以用/ EP开关来实现。

答案 5 :(得分:1)

如果您需要订购包含,则首先表示“代码嗅觉”。最有可能的是,您的代码设计得不够好。所有常用代码都应该是单独的package / dll / lib(无论如何)的一部分,并且应该从那里包含/链接。

如果您使用的是C ++ / VC ++,这通常会在您包含cpp& h文件直接来自其他项目,而不是链接到某种实用程序库。

正如有人已经指出的那样,如果你必须忍受它,文本搜索是最好的选择,但尝试以更好的方式重新设计代码(如果可以的话)。

答案 6 :(得分:0)

通常我只是grep头文件。