C语言中的预定义宏:__FILE__, __LINE__, __DATE__, __TIME__

需积分: 5 0 下载量 30 浏览量 更新于2024-08-05 收藏 717B MD 举报
"了解C语言中的预处理器宏以及在STM32单片机编程中的应用" 在C语言编程中,预处理器宏是一种强大的工具,它们在编译阶段进行文本替换,可以用于实现各种功能,如条件编译、定义常量、以及提供关于源代码元信息的功能。在给定的标题 "__DATA__和__TIME__.md" 和描述中提到的"单片机内的一些骚操作",我们将探讨其中涉及到的几个预处理器宏:`__FILE__`, `__LINE__`, `__DATE__`, `__TIME__` 和 `__FUNCTION__`,并结合STM32单片机的编程环境来理解它们的用途。 1. `__FILE__`: 这个宏展开为一个包含了当前源代码文件名的字符串常量。在示例代码中,`printf("%s\n", __FILE__)` 会打印出源代码文件的完整路径,这对于调试和日志记录非常有用,可以追踪到错误发生的具体位置。 2. `__LINE__`: 这个宏展开为一个整数值,表示当前代码行的行号。在上面的例子中,`printf("%d\n", __LINE__)` 输出了代码中调用此宏的行号,帮助开发者快速定位问题所在的行。 3. `__DATE__`: 这个宏展开为当前编译日期的字符串,格式通常是"月日年"。例如,"Jul312018" 表示的是2018年7月31日。这个信息在版本控制或构建系统中可能会有用,可以用来追踪源代码的修改时间。 4. `__TIME__`: 类似于`__DATE__`,`__TIME__` 扩展为当前编译时间的字符串,格式是"小时:分钟:秒",如"15:40:23"。这有助于了解代码何时被编译,对于自动化构建和测试过程很有价值。 5. `__FUNCTION__`: 这个宏展开为当前执行函数的名称(作为字符串)。在示例中,`printf("%s\n", __FUNCTION__)` 输出了当前执行的函数名"main",这对于调试和日志记录也有帮助,尤其是在大型项目中跟踪函数调用流程时。 这些预处理器宏在STM32单片机编程中同样适用,因为STM32通常使用基于GCC的编译器,如GNU Arm Embedded Toolchain,这些编译器都支持C语言的标准特性。在开发STM32应用时,这些宏可以帮助开发者实现更好的错误跟踪、调试信息输出和日志记录功能,从而提高开发效率和代码质量。当遇到运行时错误或需要对代码进行性能分析时,这些信息尤其有价值。

@Component public class AuthUtil { private final RedisTemplateUtil<String, Object> permRedisManager; public AuthUtil(RedisTemplateUtil<String, Object> permRedisManager) { this.permRedisManager = permRedisManager; } public static final String SYS_EMPLOYEE_NAME = "sysEmployee"; public static final String MEMBER_NAME = "member"; public static final Long MEMBER_EXPIRES_TIME = 60L * 60 * 24; public static final Long SYS_EMPLOYEE_EXPIRES_TIME = 60L * 30; public String buildToken(String id, String name, Object loginObj) { String jwt = JWTBuilder.createJWT(id, name, loginObj); permRedisManager.set(id + "RF_AUTH", jwt, MEMBER_EXPIRES_TIME); String md5 = PasswordUtil.md5(jwt); if (name.equals(AuthUtil.SYS_EMPLOYEE_NAME)) { permRedisManager.set(PasswordUtil.md5(jwt), jwt, SYS_EMPLOYEE_EXPIRES_TIME); } else if (name.equals(AuthUtil.MEMBER_NAME)) { permRedisManager.set(PasswordUtil.md5(jwt), jwt, MEMBER_EXPIRES_TIME); } return md5; } public void removeToken(long id) { Object jetObj = permRedisManager.get(id + "RF_AUTH"); if (Validator.valid(jetObj)) { String md5 = PasswordUtil.md5((String) jetObj); permRedisManager.del(id + "RF_AUTH"); permRedisManager.del(md5); } } public String buildTokenWithExpires(String id, String name, Object loginObj) { String jwt = JWTBuilder.createJWTWithExpires(id, name, loginObj, 0); permRedisManager.set(id + "RF_AUTH", jwt); return jwt; } public String buildTokenWithExpires(String id, String name, Object loginObj, long time) { String jwt = JWTBuilder.createJWTWithExpires(id, name, loginObj, time); permRedisManager.set(id + "RF_AUTH", jwt); return jwt; } public void setPerm(long id, List<?> perms) { JSONArray array = (JSONArray) JSONArray.toJSON(perms); permRedisManager.set(id + "RF_AUTH_PERM", array.toJSONString()); } }这个类用于生成token和解析token,请问登录接口用java代码怎么写?@DeleteMapping("/deleteCode/{encode}") public JsonData<User> deleteCode(@PathVariable String encode) 接口在vue前端如何访问?

2023-06-08 上传

protected void Register_Click(object sender, EventArgs e) { { if (TextBox_emailreg.Text == "") { Response.Write("<script>window.alert('没有输入邮箱');</script>"); return; } else if (TextBox_name.Text == "") { Response.Write("<script>window.alert('没有输入用户名');</script>"); return; } else if (TextBox_password.Text == "") { Response.Write("<script>window.alert('没有输入密码');</script>"); return; } SqlConnection conn = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=yijia;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"); conn.Open(); SqlCommand cmd = new SqlCommand("SELECT *FROM user_info where email = '"+ TextBox_emailreg.Text.Trim() +"'", conn); SqlDataReader sdr = cmd.ExecuteReader(); sdr.Read(); int x = 0; if (sdr.HasRows) { Response.Write("<script>window.alert('邮箱已经存在,不可以重复注册');</script>"); return; } else if (TextBox_yanzhengma.Text != (String)Session["yanzheng"]) { Label1.ForeColor = System.Drawing.Color.Red; Label1.Text = "验证码不正确,请检查你的邮件"; return; } else if (x == 0) { sdr.Close(); string time = DateTime.Now.ToString(); String MD5 = public_function.Md5Hash(TextBox_password.Text); cmd.CommandText = "insert into user_info (email,name,password,time) values ('" + TextBox_emailreg.Text + "','" + TextBox_name.Text + "','" + MD5 + "','" + time + "')"; string rows_effedted = cmd.ExecuteNonQuery().ToString(); conn

2023-06-09 上传

protected void zhaohuimi_Click(object sender, EventArgs e) { if (zhaohuimi.Text == "忘记密码") { Label4.Text = "请输入新密码:"; Label5.Visible = true; TextBox_yanzhengma.Visible = true; zhaohuimi.Text = "确认修改"; Button_yanzhengma.Visible = true; Login.Text = "去登录"; goreg.Visible = false; } else { if (TextBox_email.Text == "") { Response.Write("<script>window.alert('没有输入邮箱');</script>"); return; } else if (TextBox_password.Text == "") { Response.Write("<script>window.alert('没有输入密码');</script>"); return; } else if (TextBox_yanzhengma.Text != (String)Session["yanzheng"]) { Label1.ForeColor = System.Drawing.Color.Red; Label1.Text = "验证码不正确,请检查你的邮件"; return; } SqlConnection conn = new SqlConnection("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=yijia;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"); conn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM user_info where email = '" + TextBox_email.Text.Trim() + "'", conn); SqlDataReader sdr = cmd.ExecuteReader(); sdr.Read(); int x = 0; if (sdr.HasRows) { sdr.Close(); string time = DateTime.Now.ToString(); String MD5 = public_function.Md5Hash(TextBox_password.Text); SqlCommand sqlCmd = new SqlCommand("update user_info set password ='" + MD5 + "' where email='" + TextBox_email.Text + "'", conn); int rowCount = sqlCmd.ExecuteNonQuery(); conn.Close(); conn.Dispose(); Response.Write("<script>window.alert('密码修改成功,可以登录了');</script>"); } else { Response.Write("<script>window.alert('该邮箱还没有注册');</script>"); } Label4.Text = "请输入密码:"; Label5.Visible = false ; TextBox_yanzhengma.Visible = false ; zhaohuimi.Text = "忘记密码"; Button_yanzhengma.Visible = false ; Login.Text = "登录"; goreg.Visible = true ; Label1.Text = ""; } }

2023-06-09 上传

`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// module md_tf ; reg rst ; reg clk16x ; reg mdi ; reg clk1x_enable ; reg clk1x ; reg nrz ; reg [3:0] no_bits_rcvd ; reg sample ; reg rdn ; wire [7:0] dout ; md u1 (rst,clk16x,mdi,rdn,dout,data_ready) ; initial begin rst = 1'b0 ; clk16x = 1'b0 ; mdi = 1'b0 ; rdn = 1'b1 ; end integer md_chann ; initial begin md_chann=$fopen("md.rpt") ; $timeformat(-9,,,5) ; end parameter clock_period = 100 ; always #(clock_period/2) clk16x = ~clk16x ; initial begin $fdisplay(md_chann,"Verilog simulation of Manchester decoder\n\n") ; $shm_open("md.shm") ; $shm_probe("AS") ; $fmonitor(md_chann,"Time=%t,rst=%b,clk16=%b,clk1x=%b,mdi=%b,nrz=%b,no_bits_rcvd=%b,sample=%b,dout=%h,data_ready=%b",$time,rst,clk16x,md.clk1x_enable,md.clk1x,mdi,md.nrz,md.no_bits_rcvd,md.sample,dout,data_ready) ; #1 rst = 1'b1 ; #100 rst = 1'b0 ; // Input 8 logic 0s #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #1600 rdn = 1'b0 ; #800 rdn = 1'b1 ; #3200 // Input 8 logic 1s #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #800 mdi = 1'b1 ; #800 mdi = 1'b0 ; #2400 rdn = 1'b0 ; #800 rdn = 1'b1 ; // Input alternating 1s, 0s #1600 mdi = 1'b1 ; #1600 mdi = 1'b0 ; #1600 mdi = 1'b1 ; #1600 mdi = 1'b0 ; #1600 mdi = 1'b1 ; #1600 mdi = 1'b0 ; #1600 mdi = 1'b1 ; #1600 mdi = 1'b0 ; #1600 rst = 1'b1 ; $fdisplay (md_chann,"\nSimulation of Manchester decoder is complete.") ; $finish ; end endmodule解释代码

2023-06-12 上传