宏传递了 2 个参数,但只需要 1 个

Posted

技术标签:

【中文标题】宏传递了 2 个参数,但只需要 1 个【英文标题】:macro passed 2 arguments, but takes just 1 【发布时间】:2012-10-18 12:06:50 【问题描述】:

我的代码没有成功构建并出现此错误消息:

macro "hton_us" passed 2 arguments, but takes just 1

它发生在这一行:

hton_us( &fi.size, 1 );

这是对 hton_us 的引用

void hton_us( iu16 *us, iu8 num )

    iu16 local;

    while( num-- ) 
        local=*us;
        *us++=swap_us(local);
    

我读过一些类似的问题,告诉我使用typedef,但它对我没有帮助。

【问题讨论】:

会不会存在与你的函数同名的预处理宏? 抱怨除了你的实现之外你已经有一个 hton_us 宏。 【参考方案1】:

使用一点 C 预处理器技巧,您可以跳过宏,直接调用函数:

(hton_us)(&fi.size, 1);

通过将hton_us 括在括号中,它告诉编译器这个宏不能被扩展,因为它没有用任何参数调用,因此函数被调用了。

【讨论】:

marcin_j 答案工作正常。你有什么意见哪个更好?【参考方案2】:

检查你的头文件,你可能有以下内容:

#ifndef ENDIAN_LITTLE
#define hton_us(us)
#define hton_ul(ul)
#endif

所以可能没有定义 ENDIAN_LITTLE

【讨论】:

我使用#define ENDIAN_LITTLE;,它工作正常。你认为你的解决方案比理查德的回答更好吗? 实际上你不应该自己定义这个宏,而是使用一些编译器定义来决定应该使用什么字节顺序。我不知道任何标准方法,我只在谷歌上找到了类似的方法:androidxref.com/2.2.3/xref/external/dropbear/libtomcrypt/src/…

以上是关于宏传递了 2 个参数,但只需要 1 个的主要内容,如果未能解决你的问题,请参考以下文章

宏 MOCK_METHOD 传递了 3 个参数,但 std::pair 仅出现 2 个错误

带有可选参数的 PHP 函数

Confluence 6 用户宏示例 - Color and Size

如何将现有参数从报表传递到查询

砍字符串(用户传递的参数)[重复]

不用第三方参数,交换2个参数的值的两种宏函数