【问题标题】:Compound argument declaration复合参数声明
【发布时间】:2011-03-19 22:14:21
【问题描述】:

为了让我的代码更简洁,我可以做类似的事情

int f(int const x, y, z), g(int const x, y, z);

要声明函数 f 和 g,每个函数都接受三个 int const 参数?

编辑: 也许这是一个更好的例子:

int f(int const a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z);

这不比在每个字母前加上 int const 更简洁易读吗?

【问题讨论】:

  • 试一试并编译。有用吗?
  • @Duracell:注意“喜欢”这个词。
  • 也许我错过了这如何使代码更简洁而不是可读性降低。也许一个更好的例子会显示我缺少什么?
  • 如果你的函数有这么多参数,你应该腾出一些时间进行重构。
  • @Fritzche:有效点,但是如果有六个参数呢。

标签: c++ function arguments


【解决方案1】:

对于C代码,如果你真的坚持,可以使用old-style (K&R) function headers:

typedef int const cint;

int f(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)
 cint a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
{
    // function body here
}

请注意,我推荐这个——而且 C++ 也不支持这个,所以你可以使用它的唯一方法是在 C 中编译函数本身,并包含一个extern "C" 声明从 C++ 访问它。

不过,我还要指出,不管怎样,整个想法都让我觉得很愚蠢。首先,一个有足够参数值得考虑的函数基本上保证是一场灾难。其次,顶级const(即应用于参数本身,而不是它指向或引用的内容)完全没有意义,并且(IMO)无论如何都是一个糟糕的想法。

【讨论】:

    【解决方案2】:

    使用 Boost 预处理器,并考虑到您不想逐个描述函数参数(但这不是您问题的重点),您可以使用以下技巧:

    #include <boost/preprocessor/repetition/enum_params.hpp>
    
    int f( BOOST_PP_ENUM_PARAMS(26, int const arg) );
    

    但不要忘记,不花时间和空间来描述函数参数的整个想法是非常危险的。

    【讨论】:

      【解决方案3】:

      如果您要获取那么多相同类型的参数,是时候醒来并获取 std::/std::tr1::/boost::array&lt;int, count&gt; const&amp;。这就是数组的用途。

      【讨论】:

        【解决方案4】:

        没有:)

        顺便说一句,即使有可能,有些人也会因为你这样做而对你嗤之以鼻。

        另外,C++ 并不以简洁着称。

        【讨论】:

          【解决方案5】:

          据我所知,没有。我认为这将使您的代码更加“简洁”,就像删除 cmets 和空格一样。它会使它看起来更短,但它的可读性要差得多。 我喜欢 C++ 中每个函数声明都必须非常明确和独立的事实(尽管我从未遇到过允许您声明多个函数的语言)。 所以,简而言之,没有。

          【讨论】:

          • 技术上用一个表达式声明多个函数。
          【解决方案6】:

          你为什么需要那个?键入几个额外的字符并没有太大的区别。如果你需要它的方法超过几个,你应该重构代码,这样你就不必传递那么多参数了。

          话虽如此,在某些情况下,正确的解决方案可能是使用可变参数函数,因此您可以这样做:

          int f(const int arg1, ...)
          

          【讨论】:

            猜你喜欢
            • 2011-04-11
            • 2014-06-26
            • 1970-01-01
            • 2017-01-26
            • 2022-01-16
            • 2014-10-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多