对于已存在于#include中的函数,identifier是未定义的警告


1

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

好吧,如果函数在那里它是如何“未定义”的,并且程序编译没有错误

在此输入图像描述

我错过了什么?


您是否碰巧在特定呼叫之后出现该方法的声明?我假设您已经尝试关闭并重新打开该项目?
Ramhound

@Ramhound我想知道“函数”实际上是否意味着函数。预处理器宏也可能是这种情况,那些很容易混淆语法检查器。
Tonny,

@Tonny - 我也同意。目前尚不清楚“标识符爆炸”是否未定义在这种情况下是警告还是错误。如果是语法错误则应编译代码。如果没有整个文件或编译的实际输出,我不会我相信我们实际上可以说出这个错误正在生成的原因。这个错误信息。然而,根据我近二十年的价值使用Visual Studio来编译C ++代码,我猜想有一个缺少的括号某处int他编码。
Ramhound

Answers:


1

IDE中的语法检查程序不是100%可靠。它们越来越好,但是无法实现100%的准确性,特别是对于允许预处理器宏等的C和C ++等语言。

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

代码或包含中某处的错误(或仅警告)也可能在源文件中进一步产生虚假语法警告。

这不仅是Visual Studio的问题。它可以在任何IDE或编辑器中进行语法突出显示/检查。我已经看到它发生在XCode,Eclipse和CodeBlocks中,仅举几个例子。

一般来说:如果你遇到类似这样的事情,通常表明定义声明的源代码(在你的情况下定义explode()的包含)可能是以不清楚,模棱两可甚至错误的方式编写的。即使它在源代码中编译特定的explode(),它也可能不会对所有可能的用例进行编译。

您应该考虑重新处理该代码,以便它不再显示红线。对于需要稍后处理代码的另一个程序员来说,这会让人感到困惑。如果您需要在几个月后重新访问代码并忘记了所有这些,那么其他程序员也可以成为您。


0

这绝对是VS 2017中的一个错误。为了测试,我删除了include函数并将其放在源代码的正文中:因此红线消失了。最令人印象深刻的是:在重新激活函数后再包含,并从源代码中删除它(即一切都与以前一样),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;
}

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.