Re: Passing an address to a #define in C

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Gus,

> I'm aware of the Labels as a Value feature. However, it seems it only work
> with goto label instruction.
> In my particular case, I need to use the label just to pass the relative
> address of the label as a parameter to a @define statement.

Yes, the label-as-value is primarily used for goto expressions, but as you
can see from the online documentation:

"You can get the address of a label defined in the current function (or a
containing function) with the unary operator `&&'. The value has type void
*. This value is a constant and can be used wherever a constant of that
type is valid. For example:

     void *ptr;
     /* ... */
     ptr = &&foo;
"

So, this label-as-value thing will return the address of the label which
should be the address of the first instruction following the label.

> I tried using this and it didn't work.

This is because your code finally ends up with this expression:

(void*)ptr >> 4

and gcc doesn't allow the shift operation to be performed on pointer
types. A possible solution to your problem could be the following code:

===
#include <stdio.h>
#include <stdint.h>

#define SHADDR(ptr) (void*)((uintptr_t)(ptr) >> 4)

int main ()
{
  int a, b=10;

  label1:
    a = b + 20;
   void *ptr = SHADDR(&&label1);
}
===

Hope that helps,
Andi


> Andi Hellmund wrote:
>>
>> Hi Gus,
>>> However, it seems like it only works in GCC if goto(label1) instruction
>>> is
>>> used... Is there any other way to do this?
>>>
>>
>> you might want to have a look at this online doc about label-as-values:
>>
>> http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
>>
>> If I remember correctly, this is not part of an official standard
>> (except the GNU C standard), so the portability of your code might
>> decrease.
>>
>> Best regards,
>> Andi
>>
>>
>>
>>
>
> --
> View this message in context:
> http://old.nabble.com/Passing-an-address-to-a--define-in-C-tp31890487p31894925.html
> Sent from the gcc - Help mailing list archive at Nabble.com.
>
>
>



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux