【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

 

posted @ 2024-09-11 16:38  春野之火  阅读(273)  评论(0)    收藏  举报