Une fonction en ligne définie dans deux fichiers CPP séparés peut-il créer des symboles en double pendant la liaison?

StackOverflow https://stackoverflow.com/questions/19843380

Question

Je trouve de nombreuses ressources en ligne sur la façon dont inline (et même __attribute__((always_inline)) ou __forceinline) ne force pas le compilateur (par exemple GCC ou VisualC ++) pour alimenter la fonction. Mais quand exactement en ligne ne sera-t-il pas appliqué? Y a-t-il un exemple de jouet?

Peut-être pas nécessairement la même question, quand une fonction taguée avec inline Inclus dans deux fichiers CPP différents créent des problèmes pendant la liaison? À savoir, générer des symboles en double?

Voici un bac à sable en béton pour essayer de casser le compilateur en instruction et générer un symbole en double:

Dans myinline.h:

inline int myinline()
{
  // code that cannot be inlined...
  ...
}

Dans aux.cpp:

#include "myinline.h"
int aux()
{
  return my_inline();
}

Dans main.cpp:

#include "myinline.h"
int aux();
int main()
{
  return aux() + my_inline();
}

Ensuite, par exemple dans le cas de GCC, il y a un code (minimal) pour myinline Cela provoquera un symbole en double lors de la compilation et des liens avec:

g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o

?

Était-ce utile?

La solution

"Inlining" et "Duplicate Symbols" sont des choses différentes. La inline Les mots clés autorisent explicitement plusieurs définitions (c.-à-d. Il vous exempte de la règle à une définition), de sorte que la plate-forme (compilateur et linker) doit savoir comment gérer et déduir.

(Cela se produit tout le temps pour les fonctions de membres de la classe définies dans les en-têtes.)

Si tu veux juste génération de code Pour se produire, vous pouvez stocker l'adresse de la fonction quelque part:

auto fp = my_inline;

De cette façon, le compilateur doit générer une définition de la fonction, afin de pouvoir lui donner une adresse. Mais même si vous faites cela dans chaque unité de traduction, vous n'obtiendrez pas d'erreur de liaison, car cela sera dédupliquée au moment du lien. L'exigence selon laquelle toutes les définitions sont identiques garantissent que cela est bien défini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top