【C】Re01
一、GCC分步编译
xxx.c文件经历的一系列编译过程:
#include <stdio.h> int main() {
printf("Hello, World!\n");
return 0;
} /*
* gcc
*
* GCC的分布编译
* xxx.c文件 -> xxx.exe可执行文件
* 1、预处理 ------------------------------------------------------
* - hello.c文件 生成hello.i文件,需要指令 -E
* - hello.i 也是一个c程序
* - 预处理阶段展开头文件,宏替换,条件编译,取消注释
*
* 命令
* gcc 文件名 -E
* gcc 文件名.c -E -o 文件名.i
*
* 导入的头文件在预编译中展开,文件大小变化
*
* 2、编译 ------------------------------------------------------
* - xxx.i 文件 编译生成 xxx.s 文件 指令 -S
* - xxx.s 文件是一个汇编文件,
* - 编译阶段主要是语法的检测
* - gcc 文件名.i -S -o 文件名.s
* 3、汇编 ------------------------------------------------------
* - xxx.s 汇编文件 生成 hello.o 文件需要指令 -c
* - xxx.o 是一个二进制文件
* - 汇编阶段主要是生成让机器识别的二进制文件
*
* 4、链接 ------------------------------------------------------
* - 将hello.o 生成 hello.exe 可执行文件
* - 可以在终端中执行此文件
* gcc 文件名.o -o 文件名.exe
*
* 指令参数
* -E -> -S -> -c
* xxx.c
* -> xxx.i 预处理后的源码文件
* -> xxx.s 编译后的汇编文件
* -> xxx.o 汇编编译后的二进制文件
* -> xxx.exe 可执行文件
*
* */
二、System函数
1、CMD终端命令:
mspaint 画图
notepad 记事本
calc 计算器
control 控制面板
wmic memphysical get maxcapacity 查看最大内存容量
2、System函数
System函数可以让C语言程序执行操作系统命令
也就是将命令以字符串的形式传入执行
该函数需要包含标准库头文件 #include <stdlib.h>
#include <stdio.h>
#include <stdlib.h> int main() {
/*printf("Hello, World!\n");*/
system("gcc -v");
return 0;
}
3、Pause暂停命令
system("pause");
可用于暂停程序,防止程序运行过快窗口结束
三、自定义函数与调用
#include <stdio.h>
#include <stdlib.h> void myFunction() {
printf("my custom function \n我的自定义函数 \n");
} int main() {
myFunction();
return 0;
}
四、C4996错误问题
#include <stdio.h>
#include <stdlib.h> void myFunction() {
printf("my custom function \n我的自定义函数 \n");
} void errorC4996() {
char buf[1024] = {0};
sprintf(buf, "%s", "aaa");
printf("%s", buf);
system("pause");
} int main() {
errorC4996();
return 0;
}
老版本的函数存在内存安全隐患
解决方案1:使用加上后缀了_s的安全化的函数进行替代
#include <stdio.h>
#include <stdlib.h>
//#define _CRT_SECURE_NO_WARNINGS void myFunction() {
printf("my custom function \n我的自定义函数 \n");
} void errorC4996() {
char buf[1024] = {0};
sprintf_s(buf, "%s", "aaa");
printf_s("%s", buf);
system("pause");
} int main() {
errorC4996();
return 0;
}
解决方案2:或者是包含一个宏
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
void myFunction() {
printf("my custom function \n我的自定义函数 \n");
} void errorC4996() {
char buf[1024] = {0};
sprintf(buf, "%s", "aaa");
printf("%s", buf);
system("pause");
} int main() {
errorC4996();
return 0;
}
解决方式3:使用禁用警告
#include <stdio.h>
#include <stdlib.h>
//#define _CRT_SECURE_NO_WARNINGS
#pragma warnings(disable:4996) void myFunction() {
printf("my custom function \n我的自定义函数 \n");
} void errorC4996() {
char buf[1024] = {0};
sprintf(buf, "%s", "aaa");
printf("%s", buf);
system("pause");
} int main() {
errorC4996();
return 0;
}
【C】Re01的更多相关文章
- 【Spring-Security】Re01 入门上手
一.所需的组件 SpringBoot项目需要的POM依赖: <dependency> <groupId>org.springframework.boot</groupId ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
随机推荐
- 采用Dapr 的IoT 案例
CNCF 发布了一篇Dapr 的IoT 案例:Tempestive uses Dapr and K8s to track IoT messages | CNCF.Tempestive 是一家物联网解决 ...
- 对于 EI K 逆序对排列计数的另一种自然求和方法的理解
有一个简单的 \(O(n^3)\) DP,考虑 \(f_{x + 1, k} = \sum_{j = 0}^{x} f_{x, k - j}\),利用前缀和优化即可. 考虑这实际上是 \(f_{x + ...
- INFINI Labs 产品更新 | Agent 全新重构,优化指标采集,支持集中配置管理,支持动态下发等功能
INFINI Labs 产品又更新啦~ 本次更新主要有 Agent.Console.Loadgen 等产品,其中 Agent 进行全新重构升级,新版限制了 CPU 资源消耗,优化了内存,相比旧版内存使 ...
- Scrapy框架(四)--五大核心组件
scrapy的基本使用我们已经掌握,但是各位心中一定会有些许的疑问,我们在编写scrapy工程的时候,我们只是在定义相关类中的属性或者方法, 但是我们并没有手动的对类进行实例化或者手动调用过相关的方法 ...
- es6数组解构的原理初探
原理 以前只用过数组解构为数组,或者将其他类数组解构为数组,但是还不知道对象为什么不能解构为数组 后面学习到了Symbol.iterator属性以后才知道,只要一个对象是可迭代的,那它就可以迭代为数组 ...
- flutter 调用环信sdk 实现即时通讯
首先下载依赖 导包 import 'package:im_flutter_sdk/im_flutter_sdk.dart';登录 import 'package:flutter/material.da ...
- ARM GIC 系列文章学习(转)
原文来自:骏的世界 ARM GIC(一) cortex-A 处理器中断简介 对于ARM的处理器,中断给处理器提供了触觉,使处理器能够感知到外界的变化,从而实时的处理.本系列博文,是以ARM corte ...
- “国产双系统”出炉,RK3568J非对称AMP:Linux+RTOS/裸机
"非对称AMP"双系统是什么 AMP(Asymmetric Multi-Processing),即非对称多处理架构."非对称AMP"双系统是指多个核心相对独立运 ...
- Qt中全局变量的定义和使用
全局变量的定义 现在需要将自定义的STRParameter变量定义为全局变量,就需要新建两个文件,分别命名为"global.h"和"global.cpp" 在g ...
- MySQL索引种类
normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique full textl: 表示 全文搜索的索引. FULL ...