Je reçois une erreur d'argument invalide dans Eclipse, même si je suis convaincu que mes arguments sont bons. Les arguments suggérés contiennent un '?' Je pense que cela peut indiquer le problème, bien que je ne sache pas comment le résoudre.
J'ai fait de mon mieux pour copier l'exemple que j'ai vu ici:
http://www.cplusplus.com/reference/clibrary/cstring/memset/
Pour être certain que je comprends bien les arguments.
#include <stdio.h>
#include <string.h>
void foo()
{
char str[] = "why oh why does my IDE give me errors when I know my args are good?";
memset(str, '-', 4);
puts(str);
}
Eclipse me donne l'erreur suivante sur la ligne memset:
Arguments non valides 'Les candidats sont: void * memset (void *, int,?)'
Qu'est-ce qui peut causer cela? Et qu'est-ce qui se passe avec ça? comme le 3ème argument?
Merci d'avance!
PS: Je viens de remarquer que je reçois des erreurs similaires lorsque j'essaie d'utiliser des opérations comme malloc, calloc, etc.
Dans Eclipse:
Modifier:
Cela fonctionne parce qu’il existe un grand nombre d’inclusions par défaut et définit que le compilateur ajoute en silence derrière la scène lors de la compilation. Ces instructions permettent à Eclipse de saisir ces directives de préprocesseur autrement silencieuses afin que son propre indexeur utilise les mêmes paramètres.
La méthode suivante résout le même problème que je rencontrais. (sur Eclipse 4.2)
Project
-> Clean
)Project
-> C/C++ Index
-> Rebuild
)Project
-> Build All
)Si vous travaillez avec Visual Studio, size_t est défini comme suit:
typedef unsigned __int64 size_t;
Dans les versions précédentes d'Eclipse CDT, __int64 n'était pas défini. Vous pouvez résoudre ce problème en ajoutant dans C/C++ Général -> Chemins et symboles -> Symboles
Ou vous pouvez mettre à niveau votre version d'Eclipse CDT
Je pense que cela a quelque chose à voir avec votre configuration Eclipse.
Pris seul, ce fragment est compilé sous GCC (G ++) 4.7.1 sous Mac OS X 10.7.5 avec la ligne de commande:
g++ -O3 -g -Wall -Wextra -c ms.cpp
La seule chose surprenante à propos du troisième argument de memset()
est qu’il est de type size_t
, mais les en-têtes sont supposés le déclarer, donc cela ne devrait pas être un problème.
Si vous utilisez malloc()
et al, vous allez bien sûr inclure <stdlib.h>
. Il est également possible de dire que vous devriez utiliser <cstdio>
, <cstring>
et <cstdlib>
, mais cela ne devrait pas empêcher le code que vous avez présenté de compiler sans erreur.
J'ai eu un problème similaire lors de la compilation du code de quelqu'un, le problème était le style de code. Ils ont défini certaines méthodes de cette manière:
// ... Inside a class
static void
sleep( u32 ms );
Je suppose que c'est le style GNU. Il suffit de changer la déclaration pour
static void sleep( u32 ms );
enlevé le problème.
J'utilisais une bibliothèque C++ tierce pour le développement BeagleBone et j'ai essayé tous les moyens possibles pour l'inclure (le préprocesseur inclut, le dossier source, l'assembleur inclus, la bibliothèque incluse, le compilateur C++, le compilateur C incluant, etc.). Rafraîchissez, réindexez, nettoyez et construisez pour chaque changement que j'ai tenté. J'ai même supprimé le projet et copié uniquement les fichiers .cpp et .h dans un nouveau projet.
J'ai finalement trouvé le problème dans ma configuration et l'ai corrigé comme suit.
Cliquez avec le bouton droit sur le projet> Propriétés> Génération C/C++> Editeur de chaîne d'outils> Générateur actuel:> Sélectionner CDT Internal Builder
J'utilise g ++, pour votre information.
J'ai eu un problème similaire avec le CDT Eclipse. Mais dans mon cas, le problème était que j'avais placé l'instruction using namespace std;
dans plusieurs en-têtes. Et dans certaines conditions, lorsque j'ai inclus tous ces en-têtes, Eclipse avait un tel comportement.