Forum: Compiler & IDEs Wo stehen denn alle Funktionen/Schlüsselwörter etc. die WinAVR per default kennt ?


von Uboot- S. (uboot-stocki)


Lesenswert?

Hi,

in einem anderen Thread habe ich einen Hinweis auf "__builtin_ctz (x);" 
gefunden. Ich hätte das schon öfters brauchen können ...

Wo finde ich denn solche Sachen in der Doku ? Ich kenne zwar die 
libc-Doku aber da stehen ja nur die libc-Sachen drin ...

Wo gibts eine Liste/ÜBersicht o.ä. ???

Gruß

Andreas

von Mark B. (markbrandis)


Lesenswert?

Na in der GCC Doku?

http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

War doch tatsächlich der allererste Treffer bei Google. ;-)
Ob man diese Sachen unbedingt verwenden sollte, ist die andere Frage - 
es ist eben kein Standard-C.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mark Brandis schrieb:

> Ob man diese Sachen unbedingt verwenden sollte, ist die andere Frage -
> es ist eben kein Standard-C.

Ja und? Man kann doch trotzdem von einer effizienten Implementierung 
profitieren:
1
#if defined (__GNUC__) && !defined (__STRICT_ANSI__)
2
#define ctz(x) __builtin_ctz(x)
3
#else
4
static inline int ctz (int x)
5
{
6
   // ...
7
}
8
#endif

von Mark B. (markbrandis)


Lesenswert?

Wenn Effizienz so aussieht:

>Built-in Function: int __builtin_ctz (unsigned int x)
>
>Returns the number of trailing 0-bits in x, starting at the least
>significant bit position. If x is 0, the result is undefined.

dann programmier ich's doch lieber gleich selbst. Ist einmal Arbeit und 
kann danach beliebig oft wiederverwendet werden.

von Zulu (Gast)


Lesenswert?

>Wenn Effizienz so aussieht:

>>Built-in Function: int __builtin_ctz (unsigned int x)
>>
>>Returns the number of trailing 0-bits in x, starting at the least
>>significant bit position. If x is 0, the result is undefined.

>dann programmier ich's doch lieber gleich selbst. Ist einmal Arbeit und
>kann danach beliebig oft wiederverwendet werden.

Woraus erkennst Du da, das es ineffizient ist? Oder was soll "Wenn 
Effizienz so aussieht" heissen?

von Mark B. (markbrandis)


Lesenswert?

Dass x zur Laufzeit auch mal 0 sein kann, davon sollte man eigentlich 
ausgehen. Ich mag eben kein "undefined behaviour".

von Simon K. (simon) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Mark Brandis schrieb:
>
>> Ob man diese Sachen unbedingt verwenden sollte, ist die andere Frage -
>> es ist eben kein Standard-C.
>
> Ja und? Man kann doch trotzdem von einer effizienten Implementierung
> profitieren:
>
1
> #if defined (__GNUC__) && !defined (__STRICT_ANSI__)
2
> #define ctz(x) __builtin_ctz(x)
3
> #else
4
> static inline int ctz (int x)
5
> {
6
>    // ...
7
> }
8
> #endif
9
>

Jep, genau solche Wrapper verwende ich auch sehr gerne, wenn es darum 
geht Code, der nicht C-Standard kompatibel ist kompatibel zu machen.

Wenn man portiert, muss man sich halt darum kümmern. Statt der static 
inline funktion könnte man auch einfach ein #error Not compiled with GCC 
nehmen ;) ;) (Höhö!)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mark Brandis schrieb:
> Dass x zur Laufzeit auch mal 0 sein kann, davon sollte man eigentlich
> ausgehen. Ich mag eben kein "undefined behaviour".

Ist doch eine Frage, wofür man es verwenden will.  Wenn du mit x = 0
rechnen können musst, dann kannst du immer noch sowas machen:
1
#define ctz(x) ((x) == 0? 32: __builtin_ctz(x))

von Zulu (Gast)


Lesenswert?

@ Mark Brandis

Ach so.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.