一. 简介
前面几篇学习了 C语言中基础问题,文章如下:
常见C语言基础题说明一-CSDN博客
常见C语言基础说明二:位运算问题-CSDN博客常见C语言基础说明三:static修饰的函数或变量-CSDN博客常见C语言基础说明二:位运算问题-CSDN博客
本文继续学习 嵌入式C开发中,可能涉及的一些C语言基础问题。
二. 常见C语言基础说明三:#define宏定义与函数内部定义的变量
1. #define 的使用
#define的用法分为两种:
(1) 无参宏定义:其一般形式为“#define 宏名 字符串”。例如,“#define PI 3.14159”,在预处理阶段,编译器会将所有的PI替换为3.14159。需要注意的是,宏名的定义通常使用大写字母,以区别于变量;宏定义末尾不需要加分号;宏定义不分配内存,而变量定义会分配内存。此外,如果字符串过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)
(2) 带参宏定义:其一般形式为“#define 宏名(参数表) 字符串”。例如,“#define MAX(a, b) ((a) > (b) ? (a) : (b))”,在预处理阶段,编译器会将所有的MAX(a, b)替换为((a) > (b) ? (a) : (b))。需要注意的是,带参宏定义中的参数没有类型,预处理器只进行简单的文本替换,不进行任何类型检查或计算。为了避免出现错误,最好将宏定义中的参数和操作符都用括号括起来,以确保运算的优先级正确。
有如下 #define 宏定义,计算如下结果:
#include <stdio.h>
#define SUM(A, B) A+B
int main(void)
{
int a = 5;
int b= 6;
int c = 0;
c = 2*SUM(a, b+1);
printf("%d\n", c);
return 0;
}
分析:
#define宏定义 在C语言中,这是一种预处理命令,用于将一个标识符(宏名)定义为一个字符串(替换文本)。
其本质是一种文本替换,预处理程序在编译前会进行宏替换,用被定义的字符串替换程序中的宏名。
因此,c = 2*SUM(a, b+1) 经过(预处理阶段后)文本替换展开后为:
c = 2*a+b+1,也就是 2*5 + 6 +1为 17。
2. 字符串常量、函数内的定义的指针
有如下代码,计算出运行结果:
#include <stdio.h>
void get_string(char* buf)
{
char* ptr = "welcome";
buf = ptr;
}
int main(void)
{
char str[] = "how are you!";
get_string(str);
printf("%s\n", str);
return 0;
}
打印结果为:
how are you!
分析: