web-dev-qa-db-fra.com

Eclipse me donne des arguments invalides 'Les candidats sont: void * memset (void *, int,?)' Bien que je sache que les arguments sont bons

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.

23
djc6535

Dans Eclipse: 

  • clic droit sur le projet
  • cliquez sur les propriétés
  • Développez " C/C++ general " l'élément dans la vue de gauche de l'arborescence en cliquant sur la flèche (il suffit de cliquer sur l'élément lui-même pour ne pas développer les sous-options) 
  • Dans les sous-options, sélectionnez " Chemins d'inclusion de préprocesseur, macros, etc. "
  • Cliquez sur l'onglet " Fournisseurs ".
  • Cochez la case en regard de "/CDT GCC Paramètres du compilateur intégré [Partagé] ".

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.

17
Catskul

La méthode suivante résout le même problème que je rencontrais. (sur Eclipse 4.2)

  • Nettoyez votre projet (Project -> Clean)
  • Réindexer des fichiers (Project -> C/C++ Index -> Rebuild)
  • Reconstruisez votre projet (Project -> Build All)
2
Ramesh-X

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

  • Symbole: __int64
  • Valeur: long long

Ou vous pouvez mettre à niveau votre version d'Eclipse CDT

1
JACH

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.

1
Jonathan Leffler

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.

0
wilsan

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.

0
Raam Kumar

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.

0
Serge Roussak