c make CMakeLists.txt Demo


###########################################
cmake_minimum_required(VERSION 3.15)

#指定c/c++编译器(*必须放在project前面*)
#SET(CMAKE_C_COMPILER gcc)
#SET(CMAKE_CXX_COMPILER '/usr/bin/g++')


project(hi C)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(CMAKE_C_STANDARD 11)
set(SOURCE_FILES library.c library.h)

add_executable(hi ${SOURCE_FILES})
###########################################


cmake添加boost组件 参考:https://www.cnblogs.com/magic-428/p/9144492.html
############################################
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11")
find_package(Boost REQUIRED COMPONENTS
# regex
filesystem   # 添加 boost 的 filesystem 组件
)
if(NOT Boost_FOUND)
    message("Not found Boost")
endif()

################################################

C++ 包管理 (一个类似于Python pip 或者 nodejs npm 的东西 微软的) 并且兼容 Linux/MacOs
https://github.com/Microsoft/vcpkg

###############################################
gdb调试相关:
ps: 
 l 10     从第10行开始显示10行  
b 10    给第10行打断点 如果第10行处在循环中,则自动给每个循环里的if打断点
disp n  打印变量 n

检查内存: 参考 https://blog.csdn.net/yasi_xi/article/details/7322278

###############################################

c语言返回局部变量的几种形式
参考: https://www.cnblogs.com/iriczhao/p/11949910.html   (ps:该博客内容不保证可靠,不保证在任意平台正确执行)
返回指向int类型的执政变量 报警告: 
 warning: function returns address of local variable [-Wreturn-local-addr]
给 gcc 加上 -Wreturn-local-addr 执行后同样报段错误
20200218电话面试的丢丢思考:对于2020/02/18的我而言,函数内的局部变量在函数消亡后在内存中的存在形式任然是一个谜?
如果c编译器在函数消亡后把该块内存置为零,某些黑客是怎么在按下键盘后读取键盘按键的编码呢?
于是激发了我对于  内存检查的思考[https://blog.csdn.net/yasi_xi/article/details/7322278] 
https://www.cnblogs.com/iriczhao/p/11949910.html

###############################################
makefile 基本使用:
code:

make:
    gcc -o hello hello.c 
clean:
    rm hello 

运行 make 即执行 gcc -o hello hello.c  
运行 make clean 即执行 clean 内容 

gcc -E 生成预处理的 .i 文件  处理 '#' 号后面的内容
gcc -S 生成(其实是编译的最核心过程,也叫编译) 成 .s 文件,也就是翻译成汇编文件
gcc -c 生成 .o 文件 也叫作 .obj 文件 ,就是汇编的过程
gcc  经过 .o文件可完成最后的link(连接过程,visual studio 中经常报 link.exe 找不到文件的错误,就是这一步骤) 生成可执行文件
参考: https://blog.csdn.net/gt1025814447/article/details/80442673
下面是 clang (Target: x86_64-pc-windows-msvc  Thread model: posix InstalledDir: C:\Program Files\LLVM\bin)的同一过程
clang -E -o hello_c.i hello.c 
clang -S -o hello_c.s hello_c.i
clang -c -o hello_c.o hello_c.s
clang -o hello_c hello_c.o 
经简单测试来看 clang产生的可执行文件是gcc产生的文件大小的将近两倍左右
#######################################################################
生成coredump的方法:
ulimit -c unlimited
cat "/data/coredump/core-%e-%p-%t" proc/sys/kernel/core_pattern   
线程内存泄漏:https://www.cnblogs.com/jkred369/p/6744103.html
#######################################################################
及其危险的代码(排查bug查了半天)
code:错误示例
    char zero[MAX_ZERO_NUM];
    int icntz = 0;       // icntz == 0 时, icntz++ 其实执行了 MAX_ZERO_NUM+1 次, 这导致我的相临内存的数值被更改了,查bug半天
    while(icntz++<MAX_ZERO_NUM)strcat(zero,"0");
code:正确示例
    char zero[MAX_ZERO_NUM];
    int icntz = 1;           // 这是经验  
    while(icntz++<MAX_ZERO_NUM)strcat(zero,"0");

此处代码bug不在于i++和++i的问题
#######################################################################
c++定义一个class,其中申明一个 static 成员变量(可以是const,可以在private)
两种正确的处理姿势:
1. 声明为常量(加上const),此时必须在头文件初始化 const .... = ...; 常量不可变,此时可在private或public
2. 在public ,在cpp文件中 再次声明并定义(且不加static)类似于 int StaticMethodOfclass::static_value = -1;
ps:
 注意在.h中声明的static变量,假如有多个不同的.cpp实现这个.h的类,在每一个.cpp中均要 有 类似于  int StaticMethodOfclass::static_value = -1;
 这样的代码,实际使用中不可同时 引入 两个或多个实现 这个 .h的.cpp文件
* class中 static成员变量的意义在于 class实例化的不同的多个对象能够共享static成员变量
已经在g++8.1 和 msvc (Visual Studio 2019)中实验过,参考csdn某博客
另外 static成员变量在构造函数赋值时不可 使用 ":" 冒号赋值的方式,":"只适用于非静态成员变量或基类,但是可以在 {} 函数体里赋值
########################################################################
 


#######################################################################