2009-10-18 6 views
2

Lorsque je compile le code suivant:problème de coulée avec fonction realpath (programmation c)

#define _POSIX_C_SOURCE 200112L 
#define _ISOC99_SOURCE 
#define __EXTENSIONS__ 

#include <stdio.h> 
#include <limits.h> 
#include <stdlib.h>  

int 
main(int argc, char *argv[]) 
{ 
    char *symlinkpath = argv[1]; 
    char actualpath [PATH_MAX]; 
    char *ptr; 
    ptr = realpath(symlinkpath, actualpath); 
    printf("%s\n", ptr); 
} 

je reçois un message d'avertissement sur la ligne qui contient l'appel à la fonction realpath, en disant:

warning: assignment makes pointer from integer without a cast 

Quelqu'un sait quoi de neuf? Je cours sous Ubuntu Linux 9.04

Répondre

4

C'est très simple. Glibc traite realpath() comme une extension GNU, pas POSIX. Alors, ajoutez cette ligne:

#define _GNU_SOURCE 

... avant d'inclure stdlib.h afin qu'il soit prototypé et connu pour revenir char *. Sinon, gcc va supposer qu'il renvoie le type par défaut int. Le prototype dans stdlib.h n'est pas visible sauf si _GNU_SOURCE est défini.

Ce qui suit est conforme très bien sans avertissements avec -Wall passé:

#include <stdio.h> 
#include <limits.h> 

#define _GNU_SOURCE 
#include <stdlib.h> 

int 
main(int argc, char *argv[]) 
{ 
    char *symlinkpath = argv[1]; 
    char actualpath [PATH_MAX]; 
    char *ptr; 
    ptr = realpath(symlinkpath, actualpath); 
    printf("%s\n", ptr); 

    return 0; 
} 

Vous verrez le même comportement avec d'autres extensions populaires tels que asprintf(). Cela vaut le coup d'oeil à/usr/include/pour voir exactement combien cette macro tourne et ce qu'elle change.

+0

Merci! J'ai encore beaucoup à apprendre sur la programmation! – Ralph

+0

En fait, vous devriez lire 'man feature_test_macros'. En outre, les pages de manuel pour 'realpath',' asprintf', etc. indiquent toutes les macros qui doivent être présentes pour leur déclaration. – ephemient

+0

@ephemient: Les en-têtes sont la documentation lorsqu'il s'agit de modifier le comportement de la bibliothèque C standard. Appelez-moi paranoïaque, mais errata se produit dans les mises à jour de la documentation d'une version à l'autre. Parfois, les choses sont incorrectes, parfois les changements ne se glissent pas dans la documentation. Parfois, de nouveaux changements sont documentés de manière incorrecte. Je sais que l'étude de la glibc a été connue pour faire exploser les têtes, mais cela vaut le coup d'œil sur les en-têtes. Vous devez savoir ce que chaque macro _does_, ce qui est mieux obtenu via grep et d'autres moyens. –

2

Le compilateur ne sait pas ce qu'est realpath, donc il suppose que c'est une fonction retournant int. Il le fait pour des raisons historiques: beaucoup de vieux programmes C s'en sont servis.

Vous en manquez probablement la déclaration, par ex. en oubliant #include son fichier d'en-tête.

+0

Yup, mettre un stdlib include en haut. – aviraldg

+0

Non, y compris stdlib ne le fait pas disparaître – Ralph

+0

Si cela ne fonctionne pas, quelque chose ne va pas. –