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.h中,curl_slist_append的声明为:”
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)作为第二个参数传递给curl_slist_append。可能没有意义使用宏来实现这个目的。这只是示例程序演示正在发生的事情的简单方法。”
关于你在评论中提出的问题:“我仍然好奇是否可以将变量分配给#define。”——嗯,是和不是。你不能将任何东西“分配”给一个
#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”以外(except that the latter doesn't leave
RECIPIENT
defined)。如果您将宏定义从
"<recipient@example.com>"
更改为
任何你喜欢的其他内容,那么每次出现
RECIPIENT
都将被替换为您在
#define RECIPIENT
之后编写的内容。
所以你
可以做这样一个事情:
char *recipient = get_recipient();
#define RECIPIENT recipient
rcpt_list = curl_slist_append(rcpt_list, RECIPIENT);
但其实没有意义;你可以直接写:
rcpt_list = curl_slist_append(rcpt_list, recipient)
预处理器(编译器处理#define指令和宏展开的部分)完全不知道函数调用、变量和类似结构的内容。它只是进行文本替换,而不考虑文本的含义。(实际上是基于“标记”定义的。)
这意味着您可以滥用预处理器来做一些危险的事情。
这里有一个例子。
=
或;
。 - Keith Thompson