我的结论:宏定义在整个代码文件中,作用范围由定义行开始到文件结束或者到#undef范围内,不被代码块定界符作用
搜索资料意外看到这个博客,我觉得里面的结论有些问题,我就增加了几个简单的测试样例
http://blog.csdn.net/liuhuiyan_2014/article/details/48053037#comments
我增加的样例:
#include<stdio.h>
typedef struct
{
#define LEN 10
char c[LEN];
}str;
int main()
{
printf("LEN=%d\n",LEN);//10
return 0;
}
#include<stdio.h>
int main()
{
printf("LEN=%d\n",LEN);
/*
def_brackets4.c: In function ‘main’:
def_brackets4.c:7: 错误:‘LEN’ 未声明 (在此函数内第一次使用)
def_brackets4.c:7: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
def_brackets4.c:7: 错误:所在的函数内只报告一次。)
*/
return 0;
}
typedef struct
{
#define LEN 10
char c[LEN];
}str;
#include<stdio.h>
typedef struct
{
#define LEN 10
char c[LEN];
}str;
#undef LEN
int main()
{
printf("LEN=%d\n",LEN);
/*
def_brackets5.c: In function ‘main’:
def_brackets5.c:14: 错误:‘LEN’ 未声明 (在此函数内第一次使用)
def_brackets5.c:14: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
def_brackets5.c:14: 错误:所在的函数内只报告一次。)
*/
return 0;
}
原 博客样例:
#include<stdio.h>
#define NUM 0
void fun()
{
#undef NUM
#define NUM 100
}
int main()
{
fun();
printf("NUM=%d",NUM);//NUM=100;
return 0;
}
#include<stdio.h>
#define NUM 0
void fun();
int main()
{
fun();
printf("NUM=%d",NUM);//0
return 0;
}
void fun()
{
#undef NUM
#define NUM 100
}
#include<stdio.h>
void fun();
int main()
{
fun();
printf("NUM=%d",NUM);
/*
def_brackets2.c: In function ‘main’:
def_brackets2.c:8: 错误:‘NUM’ 未声明 (在此函数内第一次使用)
def_brackets2.c:8: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
def_brackets2.c:8: 错误:所在的函数内只报告一次。)
*/
return 0;
}
void fun()
{
#define NUM 100
}