为#define使用变量

时间:2011-11-17 00:38:45

标签: c++ c libcurl

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);

有人有任何建议吗?

3 个答案:

答案 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_appendcurl.h的声明是:

CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,
                                                 const char *);

(暂时不要担心CURL_EXTERNconst。)

因此,当您致电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.