【C语言】01 开发环境配置
1.开发环境搭建
Windows: visual studio 2008及以上,2008版本还需要安装visual assist x
Linux: vim gcc gdb
工具下载网站:
http://msdn.itellyou.cn
2.visual studio 2013的基本使用
2.1 创建新项目

2.2 选择win32控制台程序,填写项目名称,选择存储路径,点击确定

2.3 点击下一步

2.4 选择空项目,点击完成

2.5 添加文件

2.6 填写文件名称

2.7 添加按钮




2.8 编译




2.9 断点调试
双击或F9



2.10 寄存器及内存窗口的查看(程序需要运行起来才能查看)

Release版本 去掉调试信息,做了优化
64位程序
谁是程序最早执行的函数?
在console(无windows界面)程序中,main函数是用户定义的执行入口,当程序编译完成后,连接器(linker)会将mainCRTStartup连接的exe中:exe执行时,一开始执行的就是mainCRTStartup,而不是main。这是因为程序在执行时会调用各种各样的运行时库函数,因此在程序执行之前必须要先初始化好运行时库,mainCRTStartup函数会负责相应的初始化工作(调用CRTinit函数),它会完成一些C全局变量以及C内存分配等函数的初始化工作,若果使用C++编程,还要执行全局类对象的构造函数。最后mianCRTStartup才调用main函数。
console(无windows界面):mianCRTStartup(或wmainCRTStartup)==》main(其中w开头的函数是unicode版本的工程,CRTStartup:C Runtime Startup Code)
windows(有界面):WinmainCRTStartup(或wWinmainCRTStartup)==》Winmain
思考题:
如何在main()函数之前执行一些代码?
gcc中,可以使用attribute关键字,声明constructor和destructor C函数,__attrbute((constructor)) void before_main() {}
VC中不支持attribute,可以插入函数进入初始化函数表[__xi_a,__xi_z](c)和[__xc_a,__xc_z](c++),由CRTInit调用
#pragma data_seg(".CRT$XIU")
static func * before1[]={before main1};
C++:
A a;
int g_iValue=func();
作业:
默写,编译执行调试hello world
自学Linux环境下利用vim +gcc +gdb开发调试hello world
在Linux和Win上分别实现在程序main函数执行前执行一段程序
Linux 编程调试

添加调试信息
gcc -g -o hello hello.c

Gdb调试过程:
1、程序经过预处理后,即进入编译阶段,进入编译阶段,首先声明编译:
2、格式:gdb -o test test.c -g
3、进入编译:gdb test
4、显示需要编译调试的源程序:l(list)//list filename
5、设置断点:b(break)行号
6、查看设置的断点:info b
7、运行调试程序:run
8、跳到下一个断点:c(continue)
9、单步运行的话使用:n(next)/s(step into)跳到函数体 //区别在与:next执行函数体,而step不执行函数体
10、调试过程中查看某个变量的变化:print i (每次都要手动设置)//display i(设置一次一直尾随,直到用“undisplay 变量标号” 停止)
11、退出当前的调试使用finish 跳出函数
12、清楚断点 clear 行号
13、Delete 断点信息序号// 删除所有断点或设置的要删除的断点
14、退出调试 q
15、b num if i==20 设置断点的触发条件
16、condition num i==50 改变断点的触发条件
Linux平台在main函数前先执行
#include <stdio.h> __attribute((constructor)) void print_first() { printf("before main\n"); } int main(void) { //print hello world as follows printf("hello world\n"); return 0; }
运行结果如下

Windows平台
#include <stdio.h> int main(void) { // print hello world as follows printf("hello world\n"); return 0; } int before_main() { printf("before main\n"); return 0; } #pragma data_seg(".CRT$XIU") static int* before[] = { before_main };
运行结果

https://blog.csdn.net/dr_yangzdy/article/details/80647444
S2013: C4ould not find WindowsSDKDir variable from the r (2014-11-07 15:55:20)转载▼
出现上述错误后,按照Microsoft的说明,更新到VS2013 update2,仍然出错。
安装windows 8.1 sdk 离线安装包后,解决。
https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive

浙公网安备 33010602011771号