Только помните, macros
заменяются на самой preprocessor
стадии.В C
каждая функция должна быть прототипирована перед использованием / вызовом, чтобы компилятор заранее знал о ее arguments
и return type
, чтобы избежать конфликтов.
Случай 1: - когда выполняются нижеследующие кодовые блоки, имя макроса MAIN()
заменяется на code
.
#define MAIN() c##o##d##e
int main(){
MAIN();
printf("C program");
return 0;
}
int code(){
printf("C is life");
}
И это выглядит ниже после препроцессора stage
int main(){
code; /* errorenous statement */
printf("C program");
return 0;
}
int code(){
printf("C is life");
}
соблюдайте строку code;
в приведенном выше блоке кода, это вызывает ошибку компиляции .Когда вы запускаете код выше gcc -Wall -Wstrict-prototypes -Werror test.c
, где он преобразует warning
в error
.
ошибка: «код» необъявлен (первое использование в этой функции) #define MAIN () c ##o ## d ## e ^
, чтобы решить эту проблему, объявите code()
как прежде #define
int code(void); /* declaration */
Есть еще одно предупреждение, преобразованное в ошибку
ошибка: оператор без эффекта [-Werror = unused-value] #define MAIN () c ## o ## d ## e
Поскольку после замены макроса это выглядит как code;
и здесь компилятор справедливо жаловался на заявление без эффекта .Поэтому, чтобы избежать этого, измените имя макроса с MAIN()
на MAIN
.например,
#define MAIN c##o##d##e
Правильная версия кода case-1
#include<stdio.h>
int code(void);
#define MAIN c##o##d##e
int main(void){
MAIN();
printf("C program");
return 0;
}
int code(void){
printf("C is life");
return 0;
}
И он производит вывод как
C is lifeC program
Случай 2: - при выполнении приведенного ниже кода имя макроса MAIN()
заменяется на main
#define MAIN() m##a##i##n
int main(){
MAIN();
printf("C program");
return 0;
}
int code(){
printf("C is life");
}
И это выглядит на этапе препроцессора
int main(){
main; /* it causes error */
printf("C program");
return 0;
}
int code(){
printf("C is life");
}
Случай 3: - при выполнении нижеприведенных блоков кода имя макроса MAIN()
было заменено на code
, и здесь вы также объявили code()
.
#define MAIN() c##o##d##e
int code(void);
int main() {
MAIN();
printf("C program");
return 0;
}
int code(void) {
printf("C is life\n");
return 0;
}
И это выглядит ниже после стадии препроцессора
int code(void);
int main() {
code;/* error causing statement */
printf("C program");
return 0;
}
int code(void) {
printf("C is life\n");
return 0;
}
Предложите вам скомпилировать любой код C с помощью
gcc -Wall -Wstrict-prototypes -Werror test.c
, поэтому, преобразовав предупреждение в ошибку, вы узнаете больше.