2010-01-25 2 views

Répondre

24

static signifie que la méthode n'est pas associée à une instance d'une classe. (c'est-à-dire qu'il n'a pas de "ce" pointeur).

inline est une indication du compilateur que le code de la méthode doit être inclus dans la ligne où il est appelé, au lieu d'être appelé via une branche normale. (Sachez que de nombreux compilateurs ignorent ce mot-clé et utilisent leurs propres métriques pour décider s'ils doivent être intégrés).

Ce sont des concepts orthogonaux (non apparentés), donc il n'y a pas de raison particulière pour laquelle ils n'ont pas pu être combinés.

+3

La signification la plus importante de inline est que plusieurs définitions de la méthode sont autorisées (et supposées identiques). Cela permet aux définitions de fonctions d'être placées dans des fichiers d'en-tête #include à plusieurs endroits. Toujours pas de raison qu'ils ne peuvent pas être combinés. En fait, pour une méthode statique dans un modèle, ils doivent l'être. – KeithB

1

Je ne vois pas pourquoi pas. Un membre de classe statique est comme une fonction autonome avec un accès privé aux autres fonctions membres.

2

Oui, il n'y a pas de raison pour que celles-ci ne puissent pas être combinées.

1

Vous pouvez.

Cependant, le manuel de GCC indique que la fonction ne sera pas intégrée par le compilateur dans le code si:

  1. vous appelez la méthode avant de le définir, ou
  2. il y a des appels récursifs dans la définition.

Source: GCC Manual - discute à la fois C et C++.

J'ai essayé de coder ces deux scénarios dans Visual C++ en utilisant une petite classe d'échantillons appelée Class1. Voici l'extrait pertinent, où incTest est défini dans mon fichier Class1.h.

// test static inline method - based on the GCC manual's C example 
static inline int inc (int *a) 
{ 
    return (*a)++; 
} 

// test recursive call in a static inline method 
static inline int fac (int x) 
{ 
    return x * fac(x-1); 
} 

int Class1::incTest(int* x) 
{ 
    return inc(x); 
} 

Ceci est la version qui compile avec succès. Toutefois, si j'utilise Visual C++ et que je déplace la définition de inc() vers la définition d'incTest(), le fichier ne se compile pas correctement, ce qui me donne une erreur lors de l'appel de inc() en disant: a trouvé". Edit: révisé ma réponse pour prendre en compte les commentaires et les résultats de mes tests dans Visual C++.

+2

aucune de ces conditions ne vous empêche de déclarer une méthode en ligne. –

+4

C'est faux. Aucune des restrictions ne fait partie de C++. Ils peuvent limiter la capacité d'une fonction à être intégrée dans le code généré, mais vous pouvez toujours les marquer comme étant en ligne. Cela est utile s'ils doivent être définis dans un fichier d'en-tête, par exemple s'ils sont basés sur un modèle. – KeithB

Questions connexes