使用字符串变量而不是字符串文字会导致错误

时间:2014-02-07 09:52:56

标签: c++ string debugging easendmail

我正在关注此guide以c ++发送电子邮件。您可以在here

下载标题文件:easendmailobj.tlheasendmail object
#include "stdafx.h"
#include <iostream>
#include "easendmailobj.tlh"
using namespace EASendMailObjLib;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    //string email = "randomemail1@gmail.com";

    ::CoInitialize( NULL );

    IMailPtr oSmtp = NULL;
    oSmtp.CreateInstance( "EASendMailObj.Mail");
    oSmtp->LicenseCode = _T("TryIt");

    // Set your gmail email address
    oSmtp->FromAddr = _T("randomemail1@gmail.com");

    // Add recipient email address
    oSmtp->AddRecipientEx( _T("randomemail2s@hotmail.com"), 0 );

    // Set email subject
    oSmtp->Subject = _T("simple email from Visual C++ with gmail account");

    // Set email body
    oSmtp->BodyText = _T("this is a test email sent from Visual C++ project with Gmail");

    // Gmail SMTP server address
    oSmtp->ServerAddr = _T("smtp.gmail.com");

    // If you want to use direct SSL 465 port, 
    // Please add this line, otherwise TLS will be used.
    // oSmtp->ServerPort = 465;

    // detect SSL/TLS automatically
    oSmtp->SSL_init();

    // Gmail user authentication should use your 
    // Gmail email address as the user name. 
    // For example: your email is "gmailid@gmail.com", then the user should be "gmailid@gmail.com"
    oSmtp->UserName = _T("somerandomemail@gmail.com");
    oSmtp->Password = _T("somepassword");

    _tprintf(_T("Start to send email via gmail account ...\r\n" ));

    if( oSmtp->SendMail() == 0 )
    {
        _tprintf( _T("email was sent successfully!\r\n"));
    }
    else
    {
        _tprintf( _T("failed to send email with the following error: %s\r\n"),
            (const TCHAR*)oSmtp->GetLastErrDescription());
    }

    if( oSmtp != NULL )
        oSmtp.Release();

    int x;
    cin>>x;

    return 0;
}

当我尝试使用字符串变量而不是“”???

时,为什么会出错
#include "stdafx.h"
#include <iostream>
#include "easendmailobj.tlh"
using namespace EASendMailObjLib;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    string email = "randomemail1@gmail.com": //string variables

    ::CoInitialize( NULL );

    IMailPtr oSmtp = NULL;
    oSmtp.CreateInstance( "EASendMailObj.Mail");
    oSmtp->LicenseCode = _T("TryIt");

    // Set your gmail email address
    oSmtp->FromAddr = _T(email); // string variable instead of "   " , error is here

    // Add recipient email address
    oSmtp->AddRecipientEx( _T("randomemail2s@hotmail.com"), 0 );

    // Set email subject
    oSmtp->Subject = _T("simple email from Visual C++ with gmail account");

    // Set email body
    oSmtp->BodyText = _T("this is a test email sent from Visual C++ project with Gmail");

    // Gmail SMTP server address
    oSmtp->ServerAddr = _T("smtp.gmail.com");

    // If you want to use direct SSL 465 port, 
    // Please add this line, otherwise TLS will be used.
    // oSmtp->ServerPort = 465;

    // detect SSL/TLS automatically
    oSmtp->SSL_init();

    // Gmail user authentication should use your 
    // Gmail email address as the user name. 
    // For example: your email is "gmailid@gmail.com", then the user should be "gmailid@gmail.com"
    oSmtp->UserName = _T("somerandomemail@gmail.com");
    oSmtp->Password = _T("somepassword");

    _tprintf(_T("Start to send email via gmail account ...\r\n" ));

    if( oSmtp->SendMail() == 0 )
    {
        _tprintf( _T("email was sent successfully!\r\n"));
    }
    else
    {
        _tprintf( _T("failed to send email with the following error: %s\r\n"),
            (const TCHAR*)oSmtp->GetLastErrDescription());
    }

    if( oSmtp != NULL )
        oSmtp.Release();

    int x;
    cin>>x;

    return 0;
}

我收到以下错误

Error C2065: 'Lemail' : undeclared identifier

5 个答案:

答案 0 :(得分:2)

字符串文字和std::string是两个完全不同的东西。通常,当函数f期望const char*时,您可以将字符串文字传递给它,或者您可以使用类似c_str()的字符串的f(email.c_str())方法。

但问题是_T不是函数。它是一个宏,它只是在字符串文字中添加L作为前缀。您无法将其用于std::string。您需要使用一些函数进行转换。

或者定义一个与_T相同的宏,并根据是否定义wstring决定使用stringUNICODE。尝试阅读代码以及_T做了什么,你应该理解我的意思。

答案 1 :(得分:1)

这取决于是否定义了UNICODE

如果是,请使用std::wstring而不是字符串。另外,删除包裹字符串变量的_T并添加.c_str()

答案 2 :(得分:1)

如果这是标准的微软垃圾(更确切地说,是 实验失败 - 他们想要实现的是 值得称赞,但他们实际上最终得到的是无用的额外 复杂性),你最好摆脱它:功能是 main(不是_tmain),使用char(或wchar_t,具体取决于 你想要什么,但在声明中必须是char main)代替_TCHAR,忘记了_T

对于直接问题,_T的宏 只适用于字符串文字;这就是它的设计方式。 如果你在其他任何东西上使用它,它可能会扩展到类似的东西 Lemail,当然不会被人知道。

答案 3 :(得分:0)

_T()的无效用法;它适用于字符串文字。

这条线应该是;

oSmtp-&gt; FromAddr = email.c_str();

答案 4 :(得分:0)

这是_T

的定义
#if defined(_UNICODE)
#define _T(x) L ##x
#else
#define _T(x) x
#endif

正如您所看到的,它只是在L前面附加任何内容。因此,如果您传入字符串,例如_T("HELLO WORLD"),如果定义了L"HELLO WORLD",则会转换为_UNICODE

同样,如果您传入任何其他令牌,例如_T(email),它会将其转换为Lemail,这就是您收到错误的原因。

解决方法是使用std::wstringstd::string作为:

#if defined(_UNICODE)
#define String std::wstring
#else
#define String std::string
#endif

并改为使用String email