编译时添加了奇怪的字符,导致错误

Posted

技术标签:

【中文标题】编译时添加了奇怪的字符,导致错误【英文标题】:Strange character added while compilation, leads to an error 【发布时间】:2016-09-27 13:40:02 【问题描述】:

使用 Visual Studio Express 2013 编译项目时,出现此错误

....\WDL\IPlug\IPlugVST3.cpp(199):错误 C2065:“Lp”:未声明的标识符 [D:\wdl-ol\IPlugExamples\MyFirstPlugin\MyFirstPlugin-vst3.vcxproj]

奇怪的是文件IPlugVST3.cpp不包含Lp而只包含p

 switch (p->Type())
  
    case IParam::kTypeDouble:
    case IParam::kTypeInt:
    
      Parameter* param = new RangeParameter( STR16(p->GetNameForHost()), // <---- this line
                                             i,
                                             STR16(p->GetLabelForHost()),
                                             p->GetMin(),
                                             p->GetMax(),
                                             p->GetDefault(),
                                             0, // continuous
                                             flags,
                                             unitID);

      param->setPrecision (p->GetPrecision());
      parameters.addParameter(param);

为什么 C++ 编译器将它理解为 Lp 而不是 p

注意:我检查了是否没有隐藏的 unicode 字符(是否存在?)但没有...

【问题讨论】:

STR16 是宏吗?你能提供它的代码吗? 我希望 STR16 是宏,它需要一个字符串文字作为参数,例如#define STR16(s) L##s 或类似的。 @PaulR 真的!如果您将其发布为答案,我会接受。 在回答此问题之前,您需要出示您的minimal reproducible example。 @Basj:当然 - 评论现在转换为答案。 【参考方案1】:

STR16 很可能是一个宏,它需要一个字符串文字作为参数,例如

#define STR16(s) L##s

或类似的东西。如果您传递一个变量而不是字符串文字,那么您将得到类似于您正在观察的问题的内容。

【讨论】:

以上是关于编译时添加了奇怪的字符,导致错误的主要内容,如果未能解决你的问题,请参考以下文章

出现中文符号时,编译错误信息显示啥

编译器错误信息: CS1056: 意外的字符的处理办法

cmake中的奇怪字符“â”生成makefile错误

调用临时对象的方法会导致旧 c 库的编译器错误

针对 iPhone 3.0 操作系统编译时 UIActionSheets 出现奇怪错误

fmt 库:如何使用 RegEx 添加编译时字符串检查?