我正在写一个使用SMTP的小应用程序。
我有一个奇怪的错误:

identifier "Luservar" is undefined`
码:
o_smtp->BodyText = _T(uservar->get_h().c_str() + ":" + pass_str.c_str() + "\n" + get_mac().c_str());
如果我说Luservar,为什么会说uservar
我努力了:
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++的新手,也许它是合并字符串的错误方法?

最佳答案

  • 不要使用_TTEXT()。耶哥
  • 这些是肯定古老且过时的宏,Microsoft绝对需要从Windows.h中删除它们(它们本应该在几十年前删除它们)。
  • 甚至是每个人都喜欢的以Win32为中心的博客作者Raymond Chen,doesn't know why _T exists!

  • Just make sure #define UNICODE is enabled in your project properties and forget about the past

  • 如果您正在编写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()提供了char*bodyText View (即,它是同一块内存的不同表示),而不是clone或bodyText的副本,因此,如果o_smtp->BodyText是长寿的,那么您需要确保bodyTexto_smtp具有相同的生存期,或者将bodyText的字符缓冲区复制到寿命足够长的单独缓冲区中,或者确定o_smtp是否将获得其BodyText字符缓冲区的所有权。

    08-16 11:57