[Résolu] Défine préprocesseur contenant un point

Défine préprocesseur contenant un point [Résolu] - C - Programmation

Marsh Posté le 04-01-2008 à 20:17:09    

Salut les gens,
 
vala, j'aurais besoin de définir une constante préprocesseur nommée S_un.S_addr à s_addr
 
J'avais éssayé
 

Code :
  1. #define S_un.S_addr  s_addr


 
mais gcc n'aime pas trop, il plante à la compil
 

Citation :

103.c:210: error: expected identifier before ‘.’ token


 
Voici mon code original
 

Code :
  1. struct sockaddr_in addr_in;
  2. addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);


 
J'aurais aimé qu'après le passage du préprocesseur, ca donne un truc du genre
 

Code :
  1. struct sockaddr_in addr_in;
  2. addr_in.sin_addr.s_addr=inet_addr(argv[1]);


 
Le but, c'est de porter un soft codé pour win32 utilisant de facon basique les sockets win32, sur un système *nix.
 
Si quelqu'un a une idée pour mes défines ou autres, je suis preneur.
Merci davans

Message cité 1 fois
Message édité par utb diablo le 05-01-2008 à 19:27:37

---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 04-01-2008 à 20:17:09   

Reply

Marsh Posté le 04-01-2008 à 22:08:23    

On ne peut pas mettre un point dans un #define.
 
Ce que tu peux faire (même si c'est très sale), c'est te définir une struct sockaddr_in_win32 identique à ton struct sockaddr_in, mais avec une union S_un autour du champs s_addr. Ensuite tu fais un #define sockaddr_in sockaddr_in_win32 de manière à ce que toutes tes structures utilisent ta définition, et voilà. Evidemment c'est pas portable puisque ça te met la définition d'un sockaddr_in en dur dans ton code.

Reply

Marsh Posté le 04-01-2008 à 22:38:52    

je déplace sur prog


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 04-01-2008 à 22:39:13    

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par Black_lord


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 04-01-2008 à 22:48:11    

black_lord a écrit :

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par Black_lord


 
:o,  sry l'habitude
 

matafan a écrit :

On ne peut pas mettre un point dans un #define.
 
Ce que tu peux faire (même si c'est très sale), c'est te définir une struct sockaddr_in_win32 identique à ton struct sockaddr_in, mais avec une union S_un autour du champs s_addr. Ensuite tu fais un #define sockaddr_in sockaddr_in_win32 de manière à ce que toutes tes structures utilisent ta définition, et voilà. Evidemment c'est pas portable puisque ça te met la définition d'un sockaddr_in en dur dans ton code.


 
D'après ce que j'ai compris, ça semble être une bonne idée, mais, heum, comment dire ...
         Comment on fait ? :p


---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 05-01-2008 à 12:29:38    

utb diablo a écrit :

Le but, c'est de porter un soft codé pour win32 utilisant de facon basique les sockets win32, sur un système *nix.


Je ne sais pas trop ce que tu cherches à bricoler, mais ici, il y a des exemples de code socket portable...
 
http://mapage.noos.fr/emdel/reseaux.htm


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2008 à 12:30:09    

matafan a écrit :

On ne peut pas mettre un point dans un #define.


 [:arrakys]  


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2008 à 13:11:29    

Emmanuel Delahaye a écrit :


Je ne sais pas trop ce que tu cherches à bricoler, mais ici, il y a des exemples de code socket portable...
 
http://mapage.noos.fr/emdel/reseaux.htm


 
 
D'habitude je code plutôt portable, mais j'ai récupéré une centaine de code, le plus souvent codé pour Win32 avec WSADATA toussa,
 
Et pis bon, j'avais un peu la flemme de modifier une centaine de code à la main, j'ai créé un fichier windows.h dans /usr/include avec ceci dedans
 

Code :
  1. #ifndef __WIN__
  2. #define __WIN__
  3. #include <unistd.h>
  4. #include <sys/socket.h>
  5. #include <sys/types.h>
  6. #include <arpa/inet.h>
  7. #include <netinet/in.h>
  8. #include <netdb.h>
  9. #define SOCKET                  int
  10. #define WSADATA                 int
  11. #define DWORD                   unsigned long
  12. #define SOCKADDR                struct sockaddr
  13. #define SOCKADDR_IN             struct sockaddr_in
  14. #define sockaddr_in sockaddr_in_win32
  15. #define NULL                    0
  16. #define INVALID_SOCKET          -1
  17. #define SOCKET_ERROR            -1
  18. #define WSAConnect(a,b,c,d,e,f,g)       connect(a,b,c)
  19. #define WSAStartup(a,b)                 0
  20. #define WSAGetLastError()               0
  21. struct sockaddr_in_win32 {
  22.               :s
  23. };
  24. #endif


 
Un peu bourrin, mais ca marche, si je règle le problème de S_un.S_addr, je devrais être capable de compiler tout (presque) mes programmes dans problème


---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 05-01-2008 à 13:44:22    

ya des define qui ferait mieux d'etre des typedef ou des static const néanmoins

Reply

Marsh Posté le 05-01-2008 à 14:01:02    

Oui je sais :) mais je recherche pas la propreté
 
Pour l'instant, j'essaie juste de faire en sorte que mes codes compilent sous *nix, et apparemment, la solution de matafan est bonne.
 
Si on pouvait se concentrer là-dessus :) Parce que bon, en C j'ai juste les bases, donc tout ce qui est structure, union etc  J'y comprends pas grand chose :D
 
Si quelqu'un pouvait lire la réponse de matafan et me dire ce que je dois faire :) ce serait sympa :)
 
Merci


---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 05-01-2008 à 14:01:02   

Reply

Marsh Posté le 05-01-2008 à 14:16:49    

utb diablo a écrit :

Oui je sais :) mais je recherche pas la propreté


Au revoir.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2008 à 14:25:53    

Bon ok :). Et si je fais ça :

 
Code :
  1. #define NULL 0
  2. typedef int SOCKET;
  3. typedef int WSADATA;
  4. typedef unsigned long DWORD;
  5. typedef struct sockaddr SOCKADDR;
  6. typedef struct sockaddr_in SOCKADDR_IN;
  7. const int INVALID_SOCKET = -1;
  8. const int SOCKET_ERROR  = -1;
  9. int WSAConnect(a,b,c,d,e,f,g) {return connect(a,b,c);}
  10. int WSAStartup(a,b)  {return 0;}
  11. int WSAGetLastError()  {return 0;}
 

Vous voulez bien m'aider ? :) siouplait


Message édité par utb diablo le 05-01-2008 à 15:47:09

---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 05-01-2008 à 16:34:42    

Pourquoi te casser la tete pour une seule ligne qui te cachera la vraie structure (et qui pourrait etre plus tard source de bogue) ?
Pourquoi ne pas utliser une condition du style  

Code :
  1. #if defined (WIN32)
  2. addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
  3. #else
  4. addr_in.sin_addr.s_addr=inet_addr(argv[1]);
  5. #endif

Reply

Marsh Posté le 05-01-2008 à 16:37:14    

Ca m'oblige à modifier mes 100 bouts de code, ce qui est impensable :)


---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 05-01-2008 à 17:03:23    

utb diablo a écrit :

Ca m'oblige à modifier mes 100 bouts de code, ce qui est impensable :)


Bah, t'as pas l'air de connaitre l'axiome numéro 1 en informatique : La machine est là pour travailler.
 
Primo, tu te fais un script qui fait du chercher/remplacer (à tester en local avant de mettre sur un truc de prod...)
 
Deuxio, sous Win32 le code "addr_in.sin_addr.s_addr=inet_addr(argv[1]);" fonctionne aussi, vu que s_addr est définie comme un alias à S_un.S_addr.  
 
Bref, rends service à tout le monde et vire ce putain de code qu'un gizmo a ramassé sur le premier trou du cul du web sans se servir du peu de neurone qui lui restait pour savoir si c'était portable ou pas  :fou: .

Reply

Marsh Posté le 05-01-2008 à 19:27:08    

J'ai réglé ça par un script de find/replace, sed powa :)
 
Merci a tous pour votre aide et à bientôt :)


---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 05-01-2008 à 19:47:36    

tpierron a écrit :

vire ce putain de code qu'un gizmo a ramassé sur le premier trou du cul du web sans se servir du peu de neurone qui lui restait pour savoir si c'était portable ou pas  :fou: .


Joli !
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2008 à 20:38:37    


Tu peux expliciter STP ?

Reply

Marsh Posté le 05-01-2008 à 20:43:32    

matafan a écrit :


Tu peux expliciter STP ?


Pourquoi on ne pourrait pas mettre de . dans une macro ?

 


Message édité par Emmanuel Delahaye le 05-01-2008 à 20:43:47

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2008 à 21:34:08    

Dans un nom de macro ? Parce que dans un nom de macro on ne peut mettre que des lettres, des chiffres (ailleurs qu'en tête) et des underscores. M'enfin ça tu le sais. Je parlais des noms de macro.

Reply

Marsh Posté le 05-01-2008 à 21:38:01    

matafan a écrit :

Dans un nom de macro ? Parce que dans un nom de macro on ne peut mettre que des lettres, des chiffres (ailleurs qu'en tête) et des underscores. M'enfin ça tu le sais. Je parlais des noms de macro.


Ah, dans le nom, OK...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed