C 语言中 关于#define 的问题

作者&投稿:胡届 (若有异议请与网页底部的电邮联系)
c语言定义常量为什么不建议用#define~

1、尽量用const和inline而不用#define
这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。
2、再看下面的语句:
#define ASPECT_RATIO 1.653
编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己写的头文件中定义的,就会奇怪1.653是从哪里来的,甚至会花时间跟踪下去。这个问题也会出现在符号调试器中,因为同样所写的符号名不会出现在符号列表中。
解决这个问题的方案很简单:不用预处理宏,定义一个常量:
const double ASPECT_RATIO = 1.653;
这种方法很有效。但有两个特殊情况要注意。
首先,定义指针常量时会有点不同。因为常量定义一般是放在头文件中(许多源文件会包含它),除了指针所指的类型要定义成const外,重要的是指针也经常要定义成const。例如,要在头文件中定义一个基于char*的字符串常量,要写两次const:
const char * const authorName = "Scott Meyers ";

#define ABC(x) x*x

在你使用ABC(x)的时候,计算机自动的,进行原样的替换
b=ABC(a+1); 就被替换为b=a+1^a+1

注意是原样替换,所以不是(a+1)^(a+1)
所以答案是D

#define是宏定义的意思
宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。

其它说明:
#ifdef<标识>
//代码段
如果#define<标识>则……
#ifndef<标识>
//代码段
如果没有#define<标识>则……
#define
这个就不用说了。
#endif
用了条件定义结束用这个。

就是程序中 所有出现x的地方都是用(y=5)替换。
例如:
int main
{
int x;
}
则替换为是
int main
{
int (y=5);
}

问题补充:#define x (y=5)
#define是定义全局常量的表达式。全局变量在全局中有效。

y=4;
x;
printf(“%d”,y)

结果是5

就是在所有你写的代码中把单独的x 替换成 (y=5) 就想文本操作的替换一样

见到x 就是 将x 理解为(y=5)
宏定义 其实就是简单的替换 将x替换为 (y=5)!

把代码中出现的x替换成y=5


华莹市15662603687: C语言中关于#define的使用 -
凤芸雷宁: 分析:#define可以简单的理解为字符串替换! 这里你用*p++代替A,b代替B,代入MIN宏: ((*p++)<=(b)?(*p++):(b)) -------- 剩下的工作自己分析啦!

华莹市15662603687: C语言,#define语句的用法. -
凤芸雷宁: 1.简单的宏定义 格式:#define 标识符 替换列表 说明:替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量. 注意:替换列表是可以为空的 典型错误:1 2 3 4 5 6 7 8 9 10#define N = 100 inta[N]; /*这样会...

华莹市15662603687: c语言 #define的用法 -
凤芸雷宁: 展开全部#if(x==1) C语言有这样写法吗???另外,你说X值从屏幕输入不可以的,因为你就没定义怎么可能接收外部值,把你的逻辑想清楚.

华莹市15662603687: (C语言)关于#DEFINE的问题 -
凤芸雷宁: 第一个定义: #define MIN(x,y) (x)<(y)?(x):(y) int i=10,j=15,k; k=10*MIN(i,j)实际上被编译成:k = 10*(i)<(j)?(i):(j) 而10*i=100 大于 j=10,所以k=j=15; 如果想得出期望的结果,应该这样写:k=10*(MIN(I,j));第二个定义: #define M(x,y,z) x*y+z int a=...

华莹市15662603687: C语言当中的预处理#define -
凤芸雷宁: 意思是用 IS_GPIO_ALL_PERIPH(PERIPH) 代替 (((PERIPH) == GPIOA) || ((PERIPH) == GPIOB) ||((PERIPH) == GPIOC) || ((PERIPH) == GPIOD) || ((PERIPH) == GPIOE) || ((PERIPH) == GPIOF) || ((PERIPH) == GPIOG)) 到程序中...

华莹市15662603687: c语言中#define和equ的区别是什么 -
凤芸雷宁: #define 是宏定义,在预编译的时候就会处理.而EQU是在程序里的给变量赋值.他们之间在给变量赋值上就这么点区别,#DEFINE的作用很多,多用就会有体会.说的不太好,大概就这么个意思,希望不要把你毒害了.

华莹市15662603687: C语言中#define是什么意思 -
凤芸雷宁: 有的时候为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用,就是方便程序段的定义和修改. 举个例子吧,如果说你在做一个项目,这个项目的代码很长,有5000多行,而且基本上里面的同一个常量N就占了3000多行,如...

华莹市15662603687: #define在c语言中啥意思 -
凤芸雷宁: 宏定义 比如你写 #define DATA 1024 那么你的程序里 都可以 用DATA表示1024这歌数,这样做的好处就是你以后方便修改,比如你有10个地方用到了1024,但是你要改为90,那么需要修改10次,但是如果你用的是DATA,那么直接#define DATA 90就可以是.是不是很方便

华莹市15662603687: C语言中的#define有什么意义?好像可以用int,float,什么的代替啊! -
凤芸雷宁: 比如说你想定义一个数组,int num[MAX], 在c语言中,要求max必须是常数,那怎么办呢,你又不想写成int num[10], 所以你就写#define MAX 10

华莹市15662603687: C语言程序中的#include和#define均不是C语句. 对还是错的啊 -
凤芸雷宁: C语言程序中的#include和#define均不是C语句.是对的. #include是在程序编译之前要处理的内容,称为编译预处理命令.#define是C语言中的一个预处理指令,其中的“#”表示这是一条预处理命令.凡是以“#”开头的均为预处理命令,“...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网