hello world的代码及注释

1
2
3
4
5
6
7
/* this is the first c program */ #注释
include <stdio.h> #头文件
int main(void) #main函数(返回值,函数名,参数)
{
printf("hello world"); #打印
return 0; #返回语句
}

编写,编译,运行,调试

  • debug
    • 便于一步步调试
  • release
    • 更精简
  • x86
    • 32位
    • 处理器,寄存器处理4个字节
    • 内存寻址32位
  • x64
    • 64位
    • 处理器,寄存器处理8个字节
    • 内存寻址64位
  • .cpp与.c的区别
    • cpp语法更为严格
    • cpp可以在后定义变量

Linux编写,编译,运行,调试

1
2
3
4
vim hello.c
gcc hello.c -o hello #编译
gdb hello.c -o hello_g -g #编译为debug版本
gdb hello_g #打开

一些常用gdb命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
b 行号:打断点
info b:查看断点
d 断点编号: 取消断点
l 行号:显示代码
l main:显示包含main的那一行
r:run,开始运行程序,跳到第一个断点
s:step,逐语句,对应vs的F11(进入函数)
n:next,逐过程,对应vs的F10
c:continue,跳转道下一个断点
p:查看变量
display / undisplay:常显示 或 取消常显示
until 行号:跳转到指定行
finish:执行完一个函数后停下
bt:查看函数调用堆栈

在main之前执行函数

linux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
__attribute((constructor)) void before_main()
{
printf("before main!\n");
}

__attribute((destructor)) void after_main()
{
printf("after main!\n");
}

int main(void)
{
printf("This is main function.\n");
return 0;
}

win

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int before_main(void)
{
printf("before main!\n");
return 0;
}

int after_main(void)
{
printf("after main!\n");
return 0;
}

typedef int func();

#pragma data_seg(".CRT$XIU")
static func* before[] = { before_main };
#pragma data_seg(".CRT$XPU")
static func* after[] = { after_main };
#pragma data_seg()

int main(void)
{
printf("This is main function.");
return 0;
}