lkml.org 
[lkml]   [2004]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: GCC nested functions?
    On Wed, May 12, 2004 at 10:59:24AM -0700, Stephen Hemminger wrote:
    > I used GCC nested functions in the (not released) bridge sysfs interface for 2.6.6.
    > It seemed like a nice way to express the sysfs related interface without doing
    > lots of code copying (or worse lots of macros).
    >
    > The code in question looks like:
    > static ssize_t store_bridge_parm(struct class_device *cd,
    > const char *buf, size_t len,
    > void (*store)(struct net_bridge *, unsigned long))
    > {
    > struct net_bridge *br = to_bridge(cd);
    > char *endp;
    > unsigned long val;
    >
    > if (!capable(CAP_NET_ADMIN))
    > return -EPERM;
    >
    > val = simple_strtoul(buf, &endp, 0);
    > if (endp == buf)
    > return -EINVAL;
    >
    > spin_lock_bh(&br->lock);
    > store(br, val);
    > spin_unlock_bh(&br->lock);
    > return len;
    > }
    > ...
    >
    > static ssize_t store_forward_delay(struct class_device *cd, const char *buf,
    > size_t len)
    > {
    > void store(struct net_bridge *br, unsigned long val)
    > {
    > unsigned long delay = clock_t_to_jiffies(val);
    > br->forward_delay = delay;
    > if (br_is_root_bridge(br))
    > br->bridge_forward_delay = delay;
    > }
    >
    > return store_bridge_parm(cd, buf, len, store);
    > }
    >
    >
    > This works fine for GCC 2.95 and 3.X for i386 and x86_64 architectures, but the ia64
    > (cross compiler) pukes with:
    >
    > In function `store_forward_delay':
    > : undefined reference to `__ia64_trampoline'
    >
    > Redoing it as separate functions is easy enough, but the questions are:
    > - Are gcc nested functions allowed in the kernel? If not where should
    > this restriction be put in Documentation? CodingStyles?

    There is some kind of implicit prohibition in Documentation/CodingStyle
    (Chapter3: Placing braces):

    "Heretic people all over the world have claimed that this inconsistency
    is ... well ... inconsistent, but all right-thinking people know that
    (a) K&R are _right_ and (b) K&R are right. Besides, functions are
    special anyway (you can't nest them in C)."
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^

    Maybe the way it is stated is too close so subliminal ;-) But I never found
    a real need for them in C.

    Gabriel
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:03    [W:0.023 / U:0.728 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site