Makefile 实例参考

通过将一个 Makefile 从最原始的状态一步步简化,来展现多种常见的 Makefile 语法和技巧。 最初始的形态: 1main: main.o submodule.o utils.o 2 gcc main.o submodule.o util.o -o main 3 4main.o: main.c submodule.h utils.h 5 gcc -g -c main.c -o main.o 6 7submodule.o: submodule.c submodule.h utils.h 8 gcc -g -c submodule.c -o submodule.o 9 10utils.o: utils.c utils.h 11 …

【C++ 小问答】5:对结构体成员字符数组的访问

问 1struct Book { 2 char name[10]; 3 char type[10]; 4 int price; 5}; 6 7struct Book *getBook() 8{ 9 struct Book b = { 10 .name = "C Primer", 11 .type = "Programme", 12 .price = 100, 13 }; 14 return &b; 15}; 16 17int main() 18{ 19 struct Book *b = getBook(); 20 char *name = b->name; 21 char *type = …

自定义 Std::sort 对比函数时的陷阱

前言:记录这个案例的目的,是为了说明: 堆内存溢出这样的错误,可能是由于错误地自定义了一个 compare 函数而引起的。 这两者之间似乎没什么直接联系,若不是碰巧有 Address Sanitizer 的帮助,基于之前的认知,可能发现问题和定位原因都很困难。 之前在 LeetCode 上做【179. 最大数 】这道题时写了如下代码: 1bool comp3(const int a, const int b) { 2 if (a == b) { 3 return true; 4 } 5 string sa = to_string(a); 6 string sb = to_string(b); 7 return sa + sb …

从一段 Android 源码说开去

总结 在成员函数内声明的 static 变量,其生命周期依旧是整个程序,与类对象的数量、构造和销毁无关; 对一般函数及静态成员函数而言,函数名等同于函数指针;而对非静态成员函数而言,上述不成立; 构造 std::thread 的背后是 std::invoke() 一、成员函数中的 static 变量 这些天在工作中接触到了这样一段 Android 源码(可通过此处 查看): 1// android-10.0.0_r30, frameworks/native/libs/gui/Surface.cpp 2class FenceMonitor { 3public: 4 explicit FenceMonitor(const char* …

C++ 中的 Name Mangling

关于 C++ Name Mangling 的故事,还要从 C 语言说起。 C 语言的场景 在 C 语言中,一个函数的函数名唯一标识这个函数。换另外两个表述: 不同函数的界定与区分只看函数名,与返回值、入参类型和个数等因素皆无关; 出现多个相同函数名的函数定义意味着重定义错误。 1void foo() { } 2void foo(int a) { } // error: redefinition of ‘foo’ 3int foo() { } // error: conflicting types for ‘foo’ C 语言的这种对函数的处理比较原始,但也有好处。这里涉及到一个背景知识:C/C++ 源代码经过编译器编译后,编译器会用 …