2010-03-15 9 views
1

Ce sont mes erreurs:c erreur de compilation

error: static declaration of doct follows non-static declaration
error: previous declaration of doct was here.

Et mon code est:

int doct(int*); /* <- Second error points here */ 

private int doct(int *a) 
    { 
    static int a=0; /* First error points here */ 
    a++; 
    *a=a; 
    return 0; 
    } 

Toutes les suggestions?

+4

Peut-être poster un code source aider? – Extrakun

+0

Où sont les sources? Je ne peux pas en dire beaucoup à ce sujet. –

+2

Suggestion: Publiez du code pour savoir à quoi les erreurs font référence. Ce n'est pas différent de nous demander "le résultat est 12, quelle est l'équation?" – GManNickG

Répondre

2

Cette erreur se produit lorsqu'une fonction a été déclarée comme non-statique, défini statique, comme:

void foo(void); 

static void foo(void) {} 

Faire static match sur les deux, soit en le retirant de deux ou en l'ajoutant à la fois. Assurez-vous de bien comprendre ce que fait static.

Si votre fonction est marquée static, elle est uniquement visible dans cette unité de traduction. Dans votre cas, votre déclaration n'a pas de sens statique "cette fonction sera disponible, non statiquement", mais vous la définissez ensuite de manière statique.


Il existe d'autres erreurs. Le a dans votre fonction masquera le a dans la liste des paramètres. Vous devez leur donner des noms différents. *a = a ne fonctionnera pas car, dans ce cadre, a est un entier, pas un pointeur. Utilisez un nom descriptif comme counter pour l'entier.

+0

mais dans ma fonction il n'y a pas de mot-clé statique. – ambika

+2

@ambika: Vous avez 'private'. 'private' ne fait pas partie du langage C, donc je ne peux pas vous donner autre chose. Pour générer cette erreur, 'private' doit être une macro pour' static'. C'est-à-dire: '#define private static'. Mettez donc "private" dans la déclaration, ou supprimez "private" de la définition. Je vous recommande d'utiliser 'static' au lieu de' private', parce que c'est confus (il suffit de regarder les réponses à cette question.:]) – GManNickG

+0

merci GMan vous êtes super. je résous cela. – ambika

3

Vos prototypes doivent correspondre à vos fonctions réelles. Bien à vous ne le font pas:

int doct(int*); 
private int doct (int *a) 

Modifiez le prototype à:

private int doct(int*); 

ou modifier la fonction:

int doct (int *a) 

Vous devez également garder à l'esprit que private ne fait pas partie de la Langage C, mais les gens l'utilisent souvent pour remplacer statique. Cela peut être rendu possible par la ligne:

#define private static 

à la seule condition étant que ce macro doit être actif chaque fois que vous utilisez le nom private. Si cela ne fonctionne pas sur votre prototype, c'est probablement parce que ce n'est pas défini à ce moment-là. Mon conseil serait d'abandonner complètement private et d'utiliser statique (si en effet c'est ainsi que private est défini). Les gens devraient apprendre la langue, pas adopter des béquilles inutiles (à mon avis).

Autres favoris que je méprise aussi:

#define global extern 
#define begin { 
#define end } 

Le private et global sont utilisés pour signifier locale à ce fichier et global à tous les fichiers respectivement.Le begin et end sont particulièrement désagréables abominations de personnes qui devraient retourner à Pascal où ils appartiennent :-)

En plus de ce problème, votre ligne:

static int a = 0; 

sera effectivement cacher le paramètre vous passez dans la fonction (car il a le même nom) et:

*a = a; 

provoque une erreur (car il a un type différent). C'est rarement une bonne idée de le faire. Renommez l'un d'entre eux.

+0

je fais int doct (int *); à int int doct (int *); cela ne fonctionne pas. – ambika

+0

Que signifie "ne fonctionne pas"? Votre déclaration était dans un en-tête, ça ne marchera probablement pas. Est-ce dans un en-tête? – GManNickG

+1

J'aimerais savoir ce que veut dire «mot-clé privé» dans ce contexte, au début :) –