我有一个从Windows移植到Linux的库,我需要进行最少量的更改。 在库中有一些函数调用,我需要调用变量,少一个参数,我试图使用宏来执行替换。
问题是这些调用正在传递结构的地址,我收到错误“错误:”&“可能不会出现在宏参数列表中”
例如,如果库具有以下调用:
$data = array();
if (!file_exists($file)) {
throw new Exception('File "' . $file . '" do not exists');
}
$fh = fopen($file, 'r');
while ($rowData = fgetcsv($fh, $this->_lineLength, $this->_delimiter, $this->_enclosure)) {
$data[] = $rowData;
}
fclose($fh);
return $data;
我需要用
替换它foo(param1, ¶m2);
我在文件顶部添加了一个条件编译,如下所示:
foo_variant(¶m2);
有没有办法“逃避”&符号以避免此错误?
如果没有,我确实看到另一个帖子提到可以定义指向结构的指针,并使用指针而不是取结构的地址,但除非没有其他选项,否则我想避免这种情况。 感谢任何启蒙!
答案 0 :(得分:3)
只需转发整个论证表达式:
#define foo(param1, param2) foo_variant(param2)
请注意,由于预处理程序的限制,如果任何参数包含逗号,此宏将失败。
答案 1 :(得分:1)
Quentin的答案是正确的,但要提供更多背景知识:预处理器将以文本方式用foo_variant(...
替换任何#if defined LINUX_VARIANT
#define foo(param1, param2) foo_variant(¶m2)
#endif
,并且文本替换参数。如果C源文件中的一个参数有一个&符号,它只会看到它作为参数的一部分。
因此预处理器在其定义中不能接受&符号,它可以在其扩展中接受&符号。用:
foo(p1, p2);
然后
foo_variant(&p2);
将替换为
<asp:TemplateField HeaderText="DocName">
<ItemTemplate>
<asp:LinkButton ID="DocName" runat="server" Text='<%# Eval("DocName") %>' OnClick="DocNameClick"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>