force la fonction inline dans une autre unité de traduction

Cette partie du manuel de gcc est assez obscure et je ne comprends pas l’utilisation de l’atsortingbut forceinline après plusieurs tentatives.

Je définis un object et certaines fonctions pour manipuler cet object. Peu de ces fonctions peuvent utiliser des instructions atomiques et je veux que le compilateur intègre ces fonctions. Cependant, je ne veux pas écrire ces fonctions dans le fichier d’en-tête et les déclarer avec “inline statique” comme dans le kernel linux.

Existe-t-il un moyen de forcer gcc à intégrer des fonctions d’une autre unité de traduction?

vous pouvez utiliser l’atsortingbut always_inline , par exemple:

 void foo () __atsortingbute__((always_inline)); 

De la docs

always_inline En général, les fonctions ne sont pas en ligne, sauf si l’optimisation est spécifiée. Pour les fonctions déclarées inline, cet atsortingbut insère la fonction même si aucun niveau d’optimisation n’a été spécifié.

Note1 : Il n’est pas nécessaire d’utiliser inline si vous utilisez l’atsortingbut always_inline

Note2 : Si la fonction ne peut pas être en ligne, vous aurez un avertissement, si par exemple la définition n’est pas disponible lors de la compilation, cependant, avec une optimisation supérieure, gcc peut toujours la mettre en ligne dans l’appelant, il existe également un commutateur spécifique:

 -funit-at-a-time 

De la docs :

Les niveaux d’optimisation supérieurs ou égaux à 02, en particulier, activent le mode unité à la fois, ce qui permet au compilateur de prendre en compte les informations obtenues à partir de fonctions ultérieures dans le fichier lors de la compilation d’une fonction . La compilation de plusieurs fichiers à la fois en un seul fichier de sortie en mode unité à la fois permet au compilateur d’utiliser les informations obtenues de tous les fichiers lors de la compilation de chacun d’eux .

Note3 : Il n’est pas nécessaire d’avoir un prototype explicite pour pouvoir utiliser l’atsortingbut dans la définition de la fonction:

 __atsortingbute__((always_inline)) void foo() { //some code } 

Voir aussi cette discussion , elle répond à certaines de vos questions.