Libcurl使用以下方法定义电子邮件收件人:
#define RECIPIENT "<bla@bla.com>"
但如果我不想对收件人进行硬编码呢?我希望用户能够提供他/她自己的电子邮件地址,所以我需要找到一种方法来做到这一点:
std::string emailreceiver = "bla@bla.com";
#define RECIPIENT = emailreceiver
收件人用于以下行:
rcpt_list = curl_slist_append(rcpt_list, RECIPIENT);
我假设我不能简单地将其更改为
std::string emailreceiver = "bla@bla.com";
rcpt_list = curl_slist_append(rcpt_list, emailreceiver);
有人有任何建议吗?
答案 0 :(得分:9)
Curl需要一个C字符串(const char *
),而不是C ++字符串(std::string
)。所以试试:
std::string emailreceiver = "bla@bla.com";
rcpt_list = curl_slist_append(rcpt_list, emailreceiver.c_str());
根本不需要使用#define
,这只是一个例子。
答案 1 :(得分:4)
你最后的片段可能非常接近。从外观上看,curl期待一个C风格的字符串,所以你可能必须将它改为:
std::string emailreceiver = "bla@bla.com";
rcpt_list = curl_slist_append(rcpt_list, emailreceiver.c_str());
答案 2 :(得分:2)
libcurl并不是真的那么做。您问题中的#define
最接近docs/examples/smtp-multi.c
中的一行:
#define RECIPIENT "<recipient@example.com>"
宏只使用一次,后来在同一个源文件中使用:
rcpt_list = curl_slist_append(rcpt_list, RECIPIENT);
(引用行来自curl版本7.23.0。)
正如文件名所暗示的那样,这只是一个例子。在实际应用程序中,您不太可能希望将硬连线宏用于收件人名称。
curl_slist_append
中curl.h
的声明是:
CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,
const char *);
(暂时不要担心CURL_EXTERN
或const
。)
因此,当您致电curl_slist_append
时,第二个参数必须是char*
。特别是,它可以是字符串文字,直接在调用中写入或由宏扩展产生。但它可以是类型char*
的任何表达式,只要它指向有效的字符串。
您需要决定如何确定收件人电子邮件地址,并将指向该字符串的指针(C样式字符串,而不是C ++ std::string
)作为{{1}的第二个参数传递}。为此目的使用宏可能没有意义。这只是示例程序演示正在发生的事情的一种简单方法。
至于你在评论中的问题:“我仍然很好奇是否可以将变量分配给#define。” - 好吧,是的,不。您没有为<{1}}分配任何内容。 curl_slist_append
(宏定义)是一种编译时构造,它使宏名称的任何出现都被宏定义的文字文本替换。例如,这个:
#define
完全等同于:
#define
(除了后者未定义#define RECIPIENT "<recipient@example.com>"
rcpt_list = curl_slist_append(rcpt_list, RECIPIENT);
)。如果您将宏定义从rcpt_list = curl_slist_append(rcpt_list, "<recipient@example.com>");
更改为您喜欢的任何其他内容,那么RECIPIENT
的每次出现都将被您在"<recipient@example.com>"
之后编写的内容所取代。
所以你可以做这样的事情:
RECIPIENT
但没有真正的意义;你不妨写一下:
#define RECIPIENT
预处理器(处理char *recipient = get_recipient();
#define RECIPIENT recipient
rcpt_list = curl_slist_append(rcpt_list, RECIPIENT);
指令和宏扩展的编译器部分)对函数调用,变量和类似结构完全没有任何线索。它只是文本替换,而不考虑文本的含义。 (它实际上是根据令牌定义的。)
这意味着你可以滥用预处理器来做一些危险的事情。 Here's an example.