【问题标题】:c++ identifier "Luservar" is undefinedc ++标识符“Luservar”未定义
【发布时间】:2020-10-27 11:30:47
【问题描述】:

我正在编写一个使用 SMTP 的小应用程序。

我遇到了一个奇怪的错误:

identifier "Luservar" is undefined`

代码:

o_smtp->BodyText = _T(uservar->get_h().c_str() + ":" + pass_str.c_str() + "\n" + get_mac().c_str());

如果我说uservar,为什么会说Luservar

我试过了:

o_smtp->BodyText = uservar->get_h().c_str() + ":" + pass_str.c_str() + "\n" + get_mac().c_str();

然后我收到这样的错误: expression must have integral or unscoped enum type

我对 C++ 还很陌生,也许它是错误的字符串合并方式?

【问题讨论】:

  • 请发布您的编译器命令行选项。
  • c_str() 通常返回 const char* - 你不能使用 + 将它们与其他 const char* "字符串" 合并
  • @Dai 如何在 Visual Studio 中查看?
  • _T 只能应用于 "literals" - 将其应用于任意表达式是行不通的
  • 无论如何你都不应该使用_T。现在是 2020 年 - 到处使用 UTF-8! (或者至少在您的 Win32 代码中始终使用 wchar_t 和 UTF-16)。 _T 允许您重新编译我们在 1990 年代后期拥有的(过时的、可怕的、不明智的和恶魔般的)MBCS 与 ANSI 与“Unicode”世界。今天用它是完全错误的。

标签: c++


【解决方案1】:
  • 请勿使用_TTEXT()。叶神。
  • 如果您正在编写 C++(使用类和对象,并使用来自 STL 和 C++ 标准库的类型),那么您不应该编写 C(通过使用 typedef、结构和原始指针)。
    • 请记住,C++ 和 C 是不同的语言,尽管它们的句法相似并且 C++ 继承了 C。
    • 有趣的事实:Microsoft 的 VisualC++ 不是 C 编译器 - 它只支持编译 C++ 所需的 C 部分:Does Visual Studio 2017 fully support C99?
    • 我的意思是,如果你使用std::string,那么你不应该使用.c_str(),除非你真的必须——在这种情况下,你不必(好吧,不是字符串——至少串联)。

至于你的代码...

  • 我假设这些变量和函数返回值被键入为std::string
    • uservar->get_h()
    • pass_str
    • get_mac()
  • 我假设o_smtp->BodyText 被键入为char*
  • 我假设您只想将这些字符串与 C++ 代码中的文字连接在一起。
    • 在这种情况下,让std::string 为您进行连接!
std::string bodyText = uservar->get_h() + ":" + pass_str + "\n" + get_mac();

o_smtp->BodyText = bodyText.c_str();

但是您需要注意std::string bodyText 的生命周期 - 只要bodyText 离开范围,那么它的c_str 就会过期。看到这个帖子:What is std::string::c_str() lifetime?

请记住,bodyText.c_str() 提供了bodyTextchar* 视图(即,它是同一块内存的不同表示),而不是克隆或bodyText 的副本,因此,如果o_smtp->BodyText 是长寿命的,那么您需要确保bodyText 具有与o_smtp 相同的寿命或将bodyText 的字符缓冲区复制到一个单独的缓冲区,该缓冲区将寿命足够长 - 或确定如果o_smtp 将获得其BodyText 字符缓冲区的所有权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多