lkml.org 
[lkml]   [2004]   [May]   [12]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
/
FromGabriel Paubert <>
DateWed, 12 May 2004 21:34:38 +0200
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    [from the cache]
©2003-2008