对于 #include 中已经存在的函数,标识符未定义警告

对于 #include 中已经存在的函数,标识符未定义警告

我有一个在 Visual Studio 2017 中可以正常编译的 C++ 源代码,但奇怪的是,VS 2017 用红色下划线显示了我创建并留在中的某些函数的名称#include,并指责为未定义的标识符。

那么,如果函数存在,它怎么会是“未定义的”,而程序编译无错误

在此处输入图片描述

我错过了什么?

答案1

IDE 中的语法检查器并非 100% 可靠。它们正在变得越来越好,但 100% 的准确性是无法实现的,尤其是对于允许预处理器宏等的 C 和 C++ 等语言而言。

某些 #include 内容的组合,与名称空间和宏扩展相结合,可能会抛出语法检查器,即使代码实际上是正确的。

代码或包含内容中的某处的错误(或只是警告)也可能会在源文件中进一步创建虚假的语法警告。

这不仅是 Visual Studio 的问题。任何具有语法高亮/检查功能的 IDE 或编辑器都可能出现这种情况。我还看到过这种情况在 XCode、Eclipse 和 CodeBlocks 中发生,这只是几个例子。

一般来说:如果您遇到类似情况,通常表明定义声明的源代码(在您的情况下定义explode()的include)可能以不清楚、含糊甚至错误的方式编写。即使它针对您在源代码中对explode()的特定用途进行编译,也可能无法针对所有可能的用例进行编译。

您应该考虑重新编写该代码,使其不再显示红线。这会让稍后需要处理该代码的其他程序员感到困惑。如果您几个月后需要重新查看代码,并且已经完全忘记了这一点,那么另一个程序员可能就是您。

答案2

这绝对是 VS 2017 中的一个错误。为了测试,我删除了包含函数并将其放入源代码主体中:因此红线消失了。最令人印象深刻的是:在重新激活该函数并将其从源代码中删除后(即所有内容与之前完全相同),VS 不再显示红线,无论是对于该函数还是对于之前出现相同红线的其他函数...

出于好奇,这里是该函数:

vector<string> explode(string linha, string delim) {
    vector<string> parte;
    size_t pos = 0,pos2 = 0;
    do {
        pos2 = linha.find(delim, pos);
        parte.push_back(linha.substr(pos, pos2-pos));
        pos = pos2+1;
    } while(pos2 != string::npos);
    return parte;
}

我不认为问题出在我的代码上......

相关内容