Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

C Programming Language

help: define problem and meaning of {{{ and }}}.


for struct:
struct in6_addr {
  uint8_t  s6_addr[16];  

};

is provided a costant:

#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}}

what does means {{{, and }}}?
why can be used in a declaration only?
thankyou in advance,
MArio.

--------
I refer to:
http://www.faqs.org/rfcs/rfc3493.html

"[...]
The symbolic constant is named IN6ADDR_LOOPBACK_INIT and is
defined in <netinet/in.h>.  
It can be used at declaration time ONLY; for example:

      struct in6_addr loopbackaddr = IN6ADDR_LOOPBACK_INIT;

   Like IN6ADDR_ANY_INIT, this constant cannot be used in an assignment
   to a previously declared IPv6 address variable.
[...]
"

_mario.lat skrev:
> for struct:
> struct in6_addr {
>   uint8_t  s6_addr[16];  
> };

> is provided a costant:

this is not a konstant, it is macro _ meaning that it will replate your
initialization in pre-compiler

> #define IN6ADDR_LOOPBACK_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}}

#include <stdio.h>
#include <stdlib.h>

struct in6_addr{
   unsigned int  s6_addr[16];

};

/*
  *you had to may brackets; the firs pair {} is for the struck
  *initialization, the second pair {}, inside is for array initialization
  */

#define IN6ADDR_LOOPBACK_INIT {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}

int main(void){

                int i;
                struct in6_addr a = IN6ADDR_LOOPBACK_INIT ;
/*
  *pre-compiler will replace it with {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}
  */

                for(i=0;i<16;i++){
                        printf("%d ", a.s6_addr[i]);
                }

   return EXIT_SUCCESS;

"_mario.lat" <n@libero.it> writes:
> for struct:
> struct in6_addr {
>   uint8_t  s6_addr[16];  
> };

> is provided a costant:

> #define IN6ADDR_LOOPBACK_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}}

> what does means {{{, and }}}?

{{{ is simply a sequence of three distinct { tokens.
Likewise for }}}.

> why can be used in a declaration only?
[...]
> I refer to:
> http://www.faqs.org/rfcs/rfc3493.html

That RFC specifies the IN6ADDR_LOOPBACK_INIT, but it doesn't specify
how it's defined; the triple curly braces don't appear anywhere in the
RFC itself.

Some implementations do use triple braces in their definition of
IN6ADDR_LOOPBACK_INIT.  Others don't.

IN6ADDR_LOOPBACK_INIT is intended to expand to an initializer for an
object of type struct in6_addr.  If you look at the definition of type
"struct in6_addr", you'll probably see that it consists of an array
within a union within a structure.  The definition uses one level of
braces for each level of the type definition.

Note that C is fairly lax about braces in initializers.  You can
legally omit some braces; you can even add them in some cases:

    int i = { 42 };

But IMHO it's best to have the structure of the initializer match the
structure of the type.

--
Keith Thompson (The_Other_Keith) k@mib.org  <http://www.ghoti.net/~kst>
San Diego Supercomputer Center             <*>  <http://users.sdsc.edu/~kst>
"We must do something.  This is something.  Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"

In article <ln1wh2c92y.@nuthaus.mib.org>,
Keith Thompson  <k@mib.org> wrote:

>> struct in6_addr {
>>   uint8_t  s6_addr[16];  
>> };

>> is provided a costant:

>> #define IN6ADDR_LOOPBACK_INIT {{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}}

>> what does means {{{, and }}}?
>IN6ADDR_LOOPBACK_INIT is intended to expand to an initializer for an
>object of type struct in6_addr.  If you look at the definition of type
>"struct in6_addr", you'll probably see that it consists of an array
>within a union within a structure.

The OP quoted the definition of struct in6_addr (see above), and it
just consists of an array within the struct.  So the mystery is why
there are 3 rather than 2 levels of brace.

Some implementations certainly do define it as a struct containing a
union as you suggested; perhaps the OP has a buggy implementation, or
has misread some #ifdefs or something like that.

-- Richard
--
"Consideration shall be given to the need for as many as 32 characters
in some alphabets" - X3.4, 1963.

The quoted definition of struct s6_addr is from the RFC.  Reading on
in the RFC:

   The structure in6_addr above is usually implemented with an embedded
   union with extra fields that force the desired alignment level in a
   manner similar to BSD implementations of "struct in_addr".  Those
   additional implementation details are omitted here for simplicity.

   An example is as follows:

   struct in6_addr {
        union {
            uint8_t  _S6_u8[16];
            uint32_t _S6_u32[4];
            uint64_t _S6_u64[2];
        } _S6_un;
   };
   #define s6_addr _S6_un._S6_u8

Given such a definition, the triple braces are appropriate (though
single braces would also be legal).

--
Keith Thompson (The_Other_Keith) k@mib.org  <http://www.ghoti.net/~kst>
San Diego Supercomputer Center             <*>  <http://users.sdsc.edu/~kst>
"We must do something.  This is something.  Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"

Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc