2017-03-12 6 views
0

Comment puis-je conserver __builtin_prefetch() dans mon code, mais rendre les compilateurs qui ne l'ont pas compilés avec succès? (Ne rien faire où il est trouvé).Comment faire pour #ifdef la fonction __builtin_prefetch

+0

"Keep It"? les gens ont tendance à créer un emballage. –

+1

'_mm_prefetch' est légèrement plus portable d'ailleurs – harold

Répondre

1

__builtin_prefetch() est reconnu par le compilateur (gcc) pas le préprocesseur, donc vous ne serez pas en mesure de le détecter en utilisant le préprocesseur C.

Étant donné qu'un identifiant avec deux traits de soulignement principaux est réservé à l'implémentation (tout code que vous utilisez et qui définit un tel identifiant a un comportement indéfini), je le ferais dans l'autre sens.

#ifdef __GNUC__ 
#define do_prefetch(x) __builtin_prefetch(x) 
#else 
#define do_prefetch(x) 
#endif 

puis utilisez

do_prefetch(whatever); 

en cas de besoin.

De cette façon, aucun code n'est émis sauf s'il est réellement nécessaire. Puisque __builtin_prefetch() accepte un nombre variable d'arguments, vous pouvez adapter ce qui précède pour utiliser des macros variadiques (C99 et plus tard) - si vous l'utilisez avec différents nombres d'arguments à différents endroits dans votre code.

0

Ce n'est pas exactement la meilleure solution, mais elle désactive __builtin_prefetch() sur tous les autres compilateurs autres que GCC.

#ifndef __GNUC__ 
# define __builtin_prefetch(x) 
#endif