关键字static#define 定义常量和宏

简介: 关键字static#define 定义常量和宏

目录


关键字static


#define 定义常量和宏


粗略讲解数据的储存


源文件变成可执行文件的大概过程


数据的储存


在内存大致可以分为


栈区,堆区,静态区


栈区(储存局部变量,函数形参)


堆区(动态内存的储存)


静态区(储存静态变量,全局变量)


其中静态区数据的生命周期为整个程序的生命周期


源文件变成可执行文件的大概过程


源文件——预处理——编译——汇编——链接——可执行文件


1.static (静态的意思)可以修饰局部变量,全局变量,函数。


修饰局部变量(可以使局部变量的生命周期变长)(本质上是改变了数据储存的位置,从栈区变到了静态区,数据出了它的作用域不被销毁)

如:

#include <stdio.h>
void test()
{
    static int a=1;//此处a为局部变量
    a++;
    printf("a=%d\n",a);
}
int main()
{
    int i=0;
    while(i<5)
    {
        test();
        i++;
    }
    return 0;
}

输出的结果是a=2,3,4,5,6。如果把static去掉则输出的结果是:2,2,2,2,2。


所以说明static修饰局部变量时使局部变量的生命周期变长了。


2,修饰全局变量 (改变了全局变量的作用域——让静态的全局变量只能在它自己的源文件中使用,出了该文件在另一个源文件中就不能使用)(本身全局变量是由外部链接属性的,但被static修饰之后不具备外部链接,变成了内部链接属性,其只能在自己的源文件中进行使用,在另一个源文件中无法使用)


如:

一个文件

#include <stdio.h>
int main()
{
  extern int a;
  printf("%d\n", a);
  return 0;
}

另一个文件

1. 
2. static int a = 10;
3.

编译器会报错,但如果去掉static则可以编译成功,打印的结果为10.

修饰函数:改变了函数的链接属性

static修饰函数与修饰全局变量差不多,会使外部链接属性变成内部链接属性)

如:文件1

#include <stdio.h>
int main()
{
  extern sum();
  int c = 0;
  c = sum(3, 6);
  printf("c=%d\n", c);
  return 0;
}

文件2

static int sum(int a, int b)
{
  int z = 0;
  z = a + b;
  return z;
}

其中运行过程中会报错,就是上面我说的改变了文件的链接属性;但是如果去掉static则可以运行。

#define 定义常量和宏

#define 定义常量在前面的博客中已经提过

这是一般的定义函数

//这是一般的定义函数
#include <stdio.h>
int MAX(int x, int y)
{
  if (x>y)
    return x;
    else
    return y;
}
int main()
{
  int a=10,b=11;
  int c = MAX(a,b);
  printf("c=%d\n", c);
  return 0;
}

这是#define 的宏

#include <stdio.h>
#define MAX(x,y) (x>y?x:y)
int main()
{
  int a = 10, b = 11;
  int max = MAX(a, b);
  printf("max=%d", max);
  return 0;
}

注意define 并不是关键字,它是预处理指令

预处理指令从#开始

相关文章
|
11天前
|
安全 数据库连接 C++
C++一分钟之-C++中的常量与宏定义
【6月更文挑战第18天】**C++编程中,常量(`const`和`constexpr`)确保值不变,用于配置、计算和逻辑控制。宏定义是预处理阶段的文本替换,适用于条件编译和简化代码。注意`const`的正确使用,避免过度的`const_cast`。宏可能导致命名冲突、副作用和类型安全问题,应谨慎使用。优选类型安全的常量定义,以提升代码质量和可维护性。**
25 5
|
1月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
1月前
#define定义常量和宏
#define定义常量和宏
16 0
|
1月前
|
编译器 C语言 C++
define与const关键字的多种用法
define与const关键字的多种用法
37 0
|
1月前
|
编译器 C++
C++ 中 const 和 constexpr 关键字解析:常量、函数和指针
很多 C++ 的初学者看到 const 这个关键字的第一反应都是一头雾水,主要是因为 const可 以出现在很多的位置,以及后面加入的 constexpr 更是常常感到困惑,今天就为大家一一解释出现它们的含义和以及作用
121 0
|
7月前
|
存储 Cloud Native Linux
C++ extern关键字作用
C++ extern关键字作用
|
8月前
#define定义标识符以及定义宏
#define定义标识符以及定义宏
37 0
|
9月前
|
编译器
#define 定义常量和宏
工作机理:直接替换,以下列代码为例编译器直接将用到max的地方替换为100
41 0
|
11月前
|
C语言
学C的第四天(各种操作符补充;简单了解多种关键字,define定义常量和宏,结构体)(1)
10.6:关系操作符: >:大于 >=:大于等于 <:小于 <=:小于等于 !=:用于测试“不相等” ==:用于测试“相等”
|
11月前
|
Java 编译器 C语言
学C的第四天(各种操作符补充;简单了解多种关键字,define定义常量和宏,结构体)(2)
[被static修饰的变量(静态变量)和全局变量的区别:都存放在静态区中,但静态变量的作用域还是在局部,全局变量的作用域是任意地方,两者生命周期相同,都是程序结束才销毁] 2.修饰全局变量 - 称为静态全局变量 (未使用static时:)