有没有办法在C预处理器宏中“转义”&符号?

时间:2016-05-20 08:22:06

标签: c macros c-preprocessor

我有一个从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, &param2); 

我在文件顶部添加了一个条件编译,如下所示:

foo_variant(&param2);

有没有办法“逃避”&符号以避免此错误?

如果没有,我确实看到另一个帖子提到可以定义指向结构的指针,并使用指针而不是取结构的地址,但除非没有其他选项,否则我想避免这种情况。 感谢任何启蒙!

2 个答案:

答案 0 :(得分:3)

只需转发整个论证表达式:

#define  foo(param1, param2)  foo_variant(param2)

请注意,由于预处理程序的限制,如果任何参数包含逗号,此宏将失败。

答案 1 :(得分:1)

Quentin的答案是正确的,但要提供更多背景知识:预处理器将以文本方式foo_variant(...替换任何#if defined LINUX_VARIANT #define foo(param1, param2) foo_variant(&param2) #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>