C语言常用修饰符

  前言
  
  这两天在梳理自己C语言的知识,发现写了这么久的代码,居然所有的知识点都在自己的脑袋里。这可不好,万一老了呢。。。。
  
  接下来的几天里,会以文字的形式,将这些知识整理出来,分享给大家。
  
  想要看看英文版本的同学,可以详细阅读 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
  
  C语言存储类别说明符
  
  存在类别说明符 (storage-class-specifier)包含:typedef, extern, static, _Thread_local, auto, register。除了_Thread_local需要使用static或extern一起使用外,其他的说明都是可以单独使用的。
  
  1. typedef
  
  用于给某个数据类型定义一个新的名字。
  
  如:
  
  typedef int32 ac_int32;
  
  typedef struct _student_st {
  
  int age;
  
  char* pName;
  
  } student_st;
  
  2. extern
  
  引用另一个文件中的函数或全局变量。注意,这些函数和变量是不能被static修饰的。
  
  如:
  
  extern int otherInt;
  
  3. static
  
  被修饰的函数和变量,只能在当前的文件中使用。当static修改局部成员变量时,该变量只会被初始化一次,直到进程结束,才会被销毁。被static修饰的变量将会被保存在全局数据区的静态变量部分。
  
  如:
  
  static int glbInt;
  
  4. _Thread_local (C++中会使用到)
  
  5. auto
  
  表示自动存储的临时变量,也用作自动匹配变量的数据类型。
  
  如:
  
  auto int var = 4;
  
  auto var1 = 0;
  
  6. register
  
  寄存器变量,说明该变量的使用频率非常高,希望编译器尽量将它放到寄存器中。当然,编译器也可以将它忽略。
  
  使用这个修饰符,需要注意:
  
  变量需要是CPU能接受的类型,即单个值,长度小于整型。
  
  只能用到局部变量或函数形参。
  
  不能使用&来引用该变量的地址。
  
  HTTP不仅仅用于提供网页。HTTP也是构建公开服务和数据的API强大平台。HTTP简单灵活且无处不在。几乎任何你能想到的平台都有一个HTTP库,因此HTTP服务可以覆盖广泛的客户端,包括浏览器,移动设备和传统的桌面应用程序。
  
  ASP.NET Web API 是一个框架,基于.NET Framework 或.NET Core 之上构建 Web API。
  
  从本章开始学习Web API系列时,先从一个示例开始,下面使用ASP.NET Core MVC 创建 Web API。通过本次演示将了解到一个基础的Web API应用。环境使用vs 2017 +sql server 2012。示例主要知识点包括:
  
  (1)创建 Web API 项目。
  
  (2)添加模型类。
  
  (3)创建数据库上下文。
  
  (4)注册数据库上下文。
  
  (5)添加控制器。
  
  (6)添加 CRUD 方法。
  
  (7)配置路由和 URL 路径。
  
  (8)指定返回值。
  
  (9)使用Fiddle调用 Web API。
  
  (10)使用 jQuery 调用 Web API。
  
  在开发Web API之前,先制定几个有针对性的API 接口,至于api 接口业务很简单,主要是演示如何应用Web API。
  
  API接口
  
  说明
  
  请求报文
  
  响应报文
  
  GET /api/todo
  
  获取所有待办事项
  
  无
  
  待办事项的数据
  
  GET /api/todo/{id}
  
  按 ID 获取项
  
  无
  
  待办事项
  
  POST /api/todo
  
  添加新项
  
  待办事项
  
  待办事项
  
  PUT /api/todo/{id}
  
  更新现有项
  
  待办事项
  
  无
  
  DELETE /api/todo/{id}
  
  删除项
  
  无
  
  无
  
  1.1 创建web项目
  
  (1)从“文件”菜单中选择“新建” > “项目”。
  
  (2)选择“ASP.NET Core Web 应用程序”模板。 将项目命名为 TodoApi,然后单击“确定”。
  
  (3)在“新建 ASP.NET Core Web 应用程序 - TodoApi”对话框中,选择 ASP.NET Core 版本。 选择“API”模板,然后单击“确定”。 请不要选择“启用 Docker 支持”。
  
  项目模板会创建 values API。 控制器方法中默认的Http[Verb] 属性路由包括GET,POST, PUT, DELETE接口
  
  1.2 添加模型类
  
  在项目中,添加Models文件夹,新建一个 TodoItem 类,如下所示:
  
  复制代码
  
  public class TodoItem
  
  {
  
  //主键
  
  public long Id { get; set; }
  
  //待办事项名称
  
  public string Name { get; set; }
  
  //是否完成
  
  public bool IsComplete www.yingka178.com{ get; set; }
  
  }
  
  复制代码
  
  1.3 添加数据库上下文
  
  在“Models”文件夹,然后选择“添加” > “类”。 将类命名为 TodoContext,如下所示:
  
  复制代码
  
  //using Microsoft.EntityFrameworkCore;
  
  public class TodoContext: DbContext
  
  {
  
  public TodoContext(DbContextOptions<TodoContext> options)
  
  : base(options)
  
  {
  
  }
  
  public DbSet<TodoItem>www.boyunylpt1.com TodoItems { get; set; }
  
  }
  
  复制代码
  
  1.4 注册上下文
  
  在 ASP.NET Core 中,服务(如数据库上下文)必须向依赖关系注入 (DI) 容器进行注册。 该容器向控制器提供服务。这里使用Microsoft.EntityFrameworkCore.SqlServer数据提供程序。再根据模型生成数据库表(库名Todo,有一个表TodoItem)。关于如何安装数据提供程序,以及如何用模型生成数据库表,请参考“asp.net core 系列第 20 篇” 。使用迁移生成数据库后,如下所示:
  
  1.5 添加控制器
  
  在Controllers 文件夹中,选择“API 控制器类”模板。将类命名为 TodoController.cs, 代码如下所示:
  
  复制代码
  
  [Route("api/[controller]")]
  
  [ApiController]//添加特性,代表是一个Web API控制器类
  
  public class TodoController : Controller
  
  {
  
  private readonly TodoContext _context;
  
  /// <summary>
  
  /// 实例化一个EF上下文,进行数据库操作。开始初始入库一条数据
  
  /// </summary>
  
  /// <param name="context"> www.tianjuyuLe.cn</param>
  
  public TodoController(TodoContext context)
  
  {
  
  _context = context;
  
  if (_context.TodoItems.Count(www.jiahuayulpt.com) == 0)
  
  {
  
  // Create a new TodoItem if collection is www.mcyulegw.com empty,
  
  // which means you can‘t delete all TodoItems.
  
  _context.TodoItems.Add(new TodoItem { Name = "Item1" });
  
  _context.SaveChanges();
  
  public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
  
  //using Microsoft.EntityFrameworkCore;
  
  return await _context.TodoItems.ToListAsync();
  
  }
  
  /// <summary>
  
  /// 根据id,获取一条事项
  
  /// GET: api/Todo/5。 id 是参数,代表路由合并
  
  /// </summary>
  
  /// <param name="id"></param>
  
  /// <returns></returns>
  
  [HttpGet("{id}")]
  
  public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
  
  {
  
  var todoItem = await _context.TodoItems.FindAsync(id);
  
  if (todoItem == null)
  
  {
  
  return NotFound();
  
  }
  
  return todoItem;
  
  }
  
  复制代码
  
  启动vs,测试结果,如下所示,注意请求wep api 地址与action的方法名没有关系,是根据方法名之上的Http[Verb]特性来确定url地址的:
  
  1.7 路由和URL路径
  
  (1) Route特性
  
  Route是用来制定路由模板的,在第5章中也讲到。[Route("api/[controller]")]中是以api开头,替换[controller] 为控制器的名称, 按照惯例,控制器类名称减去“Controller”后缀, 因此控制器名称为“todo” ,路由不区分大小写。
  
  (2) HttpGet
  
  如果[HttpGet]属性具有路径模板,例如:[HttpGet("{id}")], 则将其附加到路径(如:api/todo/1)。在这个示例中, "{id}"是占位符变量,用于待办事项的唯一标识符。
  
    1.8 返回值
  
  上面的GetTodoItems和GetTodoItem方法的返回类型是ActionResult <T>类型。ASP.NET Core自动将对象序列化为JSON,并将JSON写入响应消息的正文中。假设没有异常,此返回类型的响应代码为200。未处理的异常被转换为5xx错误。
  
  ActionResult返回类型可以表示各种HTTP状态代码,例如在上面的GetTodoItem方法中可以返回两个不同的状态值:一个是成功的200, 一个是404未到找。所有的HTTP状态代码可以在ControllerBase中找到,例如下图中的Forbid() 是Http状态码403,NoContent()是Http 状态码204 。 等等
  
  二.测试Web API
  
  下面简单使用Fiddler来测试一下增删改增。先在本机vs 2017中启动该项目,地址为http://localhost:62271。
  
  2.1 查询
  
  在Fiddler工具中,选择GET,输入查询的http地址,右边是响应的http 状态码200, 以及查询的json结构对象。
  
  2.2 新增
  
  下面创建方法,添加以下 PostTodoItem 方法,在新增方法中调用了CreatedAtAction内置方法,如果新增成功,则返回 HTTP 201 状态代码。HTTP 201是HTTP POST方法的标准响应,该方法在服务器上创建新资源。
  
  复制代码
  
  //POST: api/Todo
  
  [HttpPost]
  
  public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem item)
  
  {
  
  _context.TodoItems.Add(item);
  
  await _context.SaveChangesAsync();
  
  return CreatedAtAction(nameof(www.dfgjpt.com GetTodoItem), new { id = item.Id }, item);
  
  }
  
  复制代码
  
  2.3 修改
  
  添加以下 PutTodoItem 方法, PutTodoItem 与 PostTodoItem 类似,但是使用的是 HTTP PUT。 响应是 204(无内容)。 根据 HTTP 规范,PUT 请求需要客户端发送整个更新的实体,而不仅仅是更改。若要支持部分更新,请使用HttpPatch特性。
  
  复制代码
  
  // PUT: api/Todo/1
  
  [HttpPut("{id}")]
  
  public async Task<IActionResult>www.yongshiyule178.com PutTodoItem(long id, TodoItem item)
  
  {
  
  if (id != item.Id)
  
  {
  
  //http 403
  
  return BadRequest();
  
  }
  
  //当前传过来的实体添加到上下文,并设置为修改
  
  _context.Entry(item).State www.yongshi123.cn= EntityState.Modified;
  
  await _context.SaveChangesAsync(www.zhongyiyuL.cn);
  
  return NoContent();
  
  }

原文地址:https://www.cnblogs.com/qwangxiao/p/10470333.html

时间: 2024-08-03 00:37:07

C语言常用修饰符的相关文章

Java基础——常用修饰符分析

在学习Java基础时会时不时用到一些修饰符,这些修饰符修饰的内容不一样,作用域也不一样,只有梳理清楚才能正确的使用它们. 不同修饰符修饰内容的作用域 public public公共的,表示该属性(或方法)公开,所有用户都可以直接进行调用. default缺省 default表示默认,不仅本类访问,而且是同包可见. private private私有的,表示该属性(方法)为只有本类内部可以访问(类内部可见).(想用private还要用set和get方法供其他方法调用,这样可以保证对属性的访问方式统

MySQL的数据类型及其常用修饰符详解

MySQL的数据类型及其常用修饰符详解 ================================================================================ 概述: ========================================================================================== Mysql的数据类型     在mysql数据库当中,每一个库都是有多张表来组成的,每一个表都是由行和列来组

c语言类型修饰符及内存

太难了,嵌入式这条路是个大坑啊,学的东西太多,但没办法,既然选择了这条路,坚持走下去吧,打好基础,铺好每一块砖,才能走的更加稳健 今天来学习一下c语言类型修饰符及内存分布 1.auto int a; 默认在内存 2.register int a; 限制变量定义在寄存器上的修饰符 编译器会尽量安排CPU的寄存器去存放这个a,如果寄存器不足,a还是放在内存中 取地址符号&对a不起作用 3.static 应用场景: 1.函数内的变量 2.函数外的变量 3.函数的修饰符(函数也是一个变量) int fu

Java中常用修饰符使用汇总

修饰符汇总: 一:public protected default private 修饰类,修饰方法,修饰属性,修饰代码块.  类: 顶级类只能用public 修饰,顶级类不能使用private 和protected 修饰. 外部类可以被public修饰或者默认不写,不能用private和protected. 内部类可为静态,可用protected和private修饰. 方法:       通常方法可以被四个访问修饰符修饰,构造方法也可以被四个访问修饰符修饰.      抽象类中的抽象方法不能被

OpenGL ES着色器语言----------------储存修饰符

一.存储修饰符 本地变量只能使用存储修饰符const. 函数参数只能用const.函数返回值类型和结构体字段不要使用const. 从一个运行时着色器到下一个运行时着色器之间进行数据类型通信是不存在的.这阻止了同一个着色器在多个顶点和片元之间同时执行. 没有存储修饰符或仅仅使用const修饰符的全局变量,可能在main()执行前进行初始化.Uniforms, attributes和varyings可能没有初始化器. 1.默认存储修饰符 如果在全局变量前没有修饰符,那么它们就与应用程序和其他处理器上

c语言修饰符总结const、static、volatile、auto、extern、register

写在前面 今天下午一个同事问「register」关键字是什么作用?噢,你说的是「register」啊,它的作用是--脑袋突然断片儿,我擦,啥意思来着,这么熟悉的陌生感.做C语言开发时间也不短了,不过好像没有用到过「register」,但作用还是知道的,一下子想不起来了,一万个草泥马飞奔过来. 其实C语言中除了register外,还包含常见的const.static.volatile.auto.extern等修饰符,现在一起再总结一下好了. register 修饰符 register,寄存器变量,

对Java语言中包、修饰符、封装的一些总结

一.包(packsge)   1.包的概念 物理上是文件夹 逻辑上是有逻辑关系的集合   2.包的作用 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用: 包可以避免名字冲突.同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别. 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类.   3.包(package)的命名规范 在包名中,可以使用.号来区分包的级别:包名一般情况下是小写 第一级 指该项目的类型,

Java语言中的修饰符

类.方法.成员变量和局部变量的可用修饰符 修饰符 类 成员方法 构造方法 成员变量 局部变量 abstract Y Y _ _ _ static _ Y _ Y _ public Y Y Y Y _ protected _ Y Y Y _ private _ Y Y Y _ synchronized _ Y _ _ _ native _ Y _ _ _ transient _ _ _ Y _ volatile _ _ _ Y _ final Y Y _ Y Y 1.访问控制修饰符: Java语言

Java面向对象编程之Java语言中的修饰符

近日,读了孙卫琴老师的<Java面向对象编程>一书,心中颇有些感悟,想着将其记录下来. Java中的修饰符 在Java语言中,有这样一些单词(说得再准确点儿,应该是形容词):abstract(抽象的).static(静态的).public(公共的).protected(受保护的).private(私有的).synchronized(同步的).native(本地的).transient(暂时的).volatile(易失的)和final(不可改变的),它们被成为修饰符,这些修饰符可以修饰类.变量和