2010-03-09 8 views
2

Le code suivant fonctionne très bienConfusion dans macro

#define open { 
#define close } 
#include<stdio.h> 
#define int char 

main() 
open 
int a ; 
printf("This is testing code"); 
close 

Mais si j'échange les lignes

#include<stdio.h> 
#define int char 

comme

#define int char 
#include<stdio.h> 

il jette beaucoup d'erreurs comme ce

In file included from /usr/include/stdio.h:36, 
       from print.c:19: 
/usr/include/bits/types.h:35: error: both 'short' and 'char' in declaration specifiers 
/usr/include/bits/types.h:37: error: both 'long' and 'char' in declaration specifiers 
/usr/include/bits/types.h:42: error: both 'short' and 'char' in declaration specifiers 
/usr/include/bits/types.h:43: error: both 'short' and 'char' in declaration specifiers 
................................................. 
so and so 

En fait, que se passe t-il dans stdio.h?

+2

devrait-il pas être #include codaddict

Répondre

5

La raison de l'échec est que, #include<stdio.h> est remplacé par le contenu de stdio.h et lorsque vous remplacez int avec char dans le contenu, vous cassez certaines déclarations.

De /usr/include/bits/types.h qui sera inclus indirectement par stdio.h

. 
. 
typedef unsigned short int __u_short; 
. 
. 

Il est clair que lorsque vous remplacez int avec char il devient:

typedef unsigned short char __u_short; 

Ce qui provoque une erreur de compilation comme short ne peut pas être appliqué sur le type de données char .

8

Il existe des variables de type défini short int, long int et ainsi de suite, qui tombe en panne évidemment lorsque vous les modifiez définir jusqu'à short char et long char. Redéfinir les types C de base n'est généralement pas une bonne idée.

+1

Je comprends parfaitement, je vis les changements après $ cc -E filename.c – abubacker

+0

+1 pour l'avertissement sur la redéfinition des types de base –

+0

Redéfinir les jetons de langue via le préprocesseur (c'est-à-dire les macros 'open' et 'close') est également une très mauvaise idée, et a été la source de beaucoup de brûlures d'estomac pour moi dans le passé. Sans oublier que ces définitions particulières vous mordront si vous voulez utiliser les fonctions POSIX 'open' et 'close'. –

0

Vous #define sera activé et remplacera tous les int à l'intérieur de stdio.h et tous les fichiers qu'il contient provoquant trop d'erreurs de confusion.

Depuis, les erreurs sont de types.h, il faut modifier certaines choses comme « short int » pour etc « court char »