Путаница в макросе - PullRequest
       28

Путаница в макросе

2 голосов
/ 09 марта 2010

Следующий код работает нормально

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

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

Но если я обменяю линии

#include<stdio.h>
#define int char 

как

#define int char 
#include<stdio.h> 

выдает много ошибок, подобных этой

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 

На самом деле, что происходит внутри stdio.h?

Ответы [ 3 ]

8 голосов
/ 09 марта 2010

Существуют определенные переменные типа short int, long int и т. Д., Которые, очевидно, завершаются ошибкой, когда вы изменяете их через define на short char и long char.

Переопределение базовых типов Си обычно не очень хорошая идея.

5 голосов
/ 09 марта 2010

Причина сбоя заключается в том, что #include<stdio.h> заменяется содержимым stdio.h, а когда вы заменяете int на char внутри содержимого, вы нарушаете некоторые объявления.

С /usr/include/bits/types.h, который включается косвенно через stdio.h

.
.
typedef unsigned short int __u_short;
.
.

Ясно, что когда вы заменяете int на char, оно становится:

typedef unsigned short char __u_short;

Что приводит к ошибке компиляции, поскольку short нельзя применить к типу данных char.

0 голосов
/ 09 марта 2010

Вы активируете #define и заменяете все int внутри stdio.h и все включенные в него файлы, вызывая слишком много запутанных ошибок.

Так как ошибки происходят из types.h, он должен изменить некоторые вещи, такие как 'short int', на 'short char' и т. Д.

...