Comment puis-je supprimer le "déclaration implicite de la fonction" mises en garde?
Comment puis-je compiler le fichier lex avec gcc sans recevoir les avertissements suivants?
lex.yy.c: In function `yy_init_buffer':
lex.yy.c:1688: warning: implicit declaration of function `fileno'
lex.l: In function `storeLexeme':
lex.l:134: warning: implicit declaration of function `strdup'
Ce sont les bibliothèques j'ai compris.
%{
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
%}
La fonction yy_init_buffer n'est pas dans le fichier. Ce qui suit est la fonction storeLexeme.
int storeLexeme() {
for (int i = 0; i < count; i++) {
char *curr = *(symbolTable + i);
if (strcmp(curr, yytext) == 0) {
return i;
}
}
char *lexeme = (char *)malloc(sizeof(char *));
lexeme = (char *)strdup(yytext);
symbolTable[count] = lexeme;
count++;
return (count - 1);
}
Comment puis-je supprimer les avertissements?
J'ai changé le flex de la balise, comme il est à propos d'Adobe flex et pas GNU lex clone.
Quelle plate-forme, UNIX ou Windows?
Ce ne sont pas des "bibliothèques"; ils sont "en-têtes". Les bibliothèques sont utilisés dans la ligne de liaison; le code source de références en-têtes.
Quelle plate-forme, UNIX ou Windows?
Ce ne sont pas des "bibliothèques"; ils sont "en-têtes". Les bibliothèques sont utilisés dans la ligne de liaison; le code source de références en-têtes.
OriginalL'auteur idealistikz | 2012-02-24
Vous devez vous connecter pour publier un commentaire.
Ni
strdup
nifileno
ISO C fonctions, ils font partie de la norme POSIX.Maintenant qu'ils sont disponibles sur votre plate-forme dépend de votre plate-forme.
Si vous êtes en utilisant les outils Microsoft, vous voudrez peut-être chercher dans
_fileno
pour le second (fileno
est obsolète dans VC2005). Plutôt une excellente version destrdup
peut être trouvé ici.Bien que, après avoir soufflé mon propre klaxon avec ce code, vous pouvez également utiliser
_strdup
puisqu'il remplace le aussi-déconseilléstrdup
🙂Ces devrait, espérons-le travail correct comme-est depuis qu'ils sont dans
stdio.h
etstring.h
, deux de l'inclure des fichiers que vous utilisez déjà.Si vous êtes sur un UNIX dérivé, ces fonctions doivent être disponibles dans
stdio.h
(pourfileno
) etstring.h
(pourstrdup
). Étant donné qu'il semble que vous êtes déjà, y compris les fichiers, le problème est sans doute ailleurs.Est une possibilité si vous êtes à la compilation dans un de la stricte modes comme
__STRICT_ANSI__
dans gcc), où ni la définir.Vous devriez avoir un regard sur les haut de votre générés
lex.yy.c
etlex.l
fichiers afin de confirmer que les fichiers d'en-tête sont être inclus et également vérifier les paramètres de ligne de commande que vous êtes en passant pour le compilateur._fileno
, il y a aussi_strdup
si vous utilisez MS-outils.Voudrais juste ajouter que je suis sous Linux (debian/ubuntu) et avait pour compiler avec -D _GNU_SOURCE pour que le compilateur reconnaître cette fonction à partir de wchar.h
OriginalL'auteur paxdiablo
Je suggère cette option (indiquer au compilateur que vous utilisez POSIX):
De gens semblent avoir resserré la fonction contrôle au cours des dernières années et nous espérons que lorsque la consistance est bonne et très répandue, nous pouvons jeter le automake ordures.
-D_POSIX_C_SOURCE=1
dans le Makefile (ou Makefile.suis -)OriginalL'auteur Tel
Envisager d'ajouter la ligne suivante:
J'ai affronté le problème lorsque j'ai compilé avec
-std=c99 -pedantic -pedantic-errors
. En ajoutant la ligne ci-dessus ont résolu le problème pour moi.extern
est ici redondant. C'est une déclaration de fonction, de toute façon et sansstatic
mot-clé, son lien est externe.oui, aussi simple que cela
OriginalL'auteur Arun
J'ai aussi eu ce problème lors de l'utilisation de flex.
J'ai utilisé
-std=gnu99
plutôt que-std=c99
qui a résolu le problème.OriginalL'auteur en4bz
Vous déclarez la fonction avant de l'utiliser:
ou inclure l'en-tête où la fonction est déclarée.
C suppose implicitement non déclarées fonctions type de retour
int
et en déduit les paramètres de la façon dont vous appelez la fonction. C'est dépréciée en C++.Ce n'est pas le storeLexeme fonction c'est de se plaindre de la strdup à partir de là.
Avez-vous également déclarer
strdup
etfileno
ou inclure les en-têtes?oui, j'ai vu que maintenant, mais le principe est toujours le même.
OriginalL'auteur Luchian Grigore