C++
文章平均质量分 63
介绍C++一些重要知识。应用篇详细介绍教材很少讲的实际开发问题
阿兵-AI医疗
这个作者很懒,什么都没留下…
展开
-
Visual Studio 配置DLL
我们在用Visual Studio进行开发时,如果没有正确配置DLL,就会出现类似“丢失***.dll”的错误。DLL配置有哪些方法?原创 2023-12-29 13:07:35 · 1459 阅读 · 0 评论 -
CMake之建立多模块工程
在Windows下, 用CMake和Visual Studio建立一个包含多个模块的工程,其中有静态库和动态库。多工程本方案由一个可执行文件和一个静态库和一个动态库构成,可执行文件调用了这两个库文件,可执行文件和动态库最后生成在bin目录下,静态库生成在libs目录。目录结构├── bin├── build├── CMakeLists.txt├── libs└── src ├── CMakeLists.txt ├── libdynamic │ ├── CMak.原创 2021-04-03 10:32:55 · 2823 阅读 · 1 评论 -
CMake之建立简单工程
最简单的例子目录结构.├── CMakeLists.txt└── main.cppmain.cpp#include <iostream>int main(){ std::cout <<"Hello World" << std::endl; return 0;}CMakeLists.txtPROJECT (SimpleExample)SET(SRC_LIST main.cpp)MESSAGE(STATUS "This is BI原创 2021-04-03 09:50:19 · 443 阅读 · 0 评论 -
应用篇之线程基础
基本概念 理解线程是至关重要的,因为每个进程至少都有一个线程。我们在讨论了进程实际上有两个组成部分:一个进程内核对象和一个地址空间。类似地,线程也有两个组成部分:一个是线程的内核对象,操作系统用它管理线程。系统还用内核对象来存放线程统计信息的地方。一个线程栈,用于维护线程执行时所需的所有函数参数和局部变量。进程是惰性。进程从来不执行任何东西,它只是一个线程的容器。线程必然是在某个进程的...原创 2020-04-30 22:52:00 · 216 阅读 · 0 评论 -
DLL系列5.延迟载入DLL
基本概念 为了让DLL更易于使用, Microsoft Visual C++提供了一个很棒的特性,即延迟载入DLL。一个延迟载入的DLL是隐式链接的,系统一开始不会将该DLL载入,只有当我们的代码试图去引用DLL中包含的一个符号时,系统才会实际载入该DLL。延迟载入DLL在下列情况下非常有用。如果应用程序使用了多个DLL,那么它的初始化可能会比较慢,因为加载程序要将所有必需的DLL映射到进...原创 2020-04-30 22:40:17 · 777 阅读 · 0 评论 -
DLL系列6.函数转发器
基本概念 函数转发器(function forwarder)是DLL输出段中的一个条目,用来将一个函数调用转发到另一个DLL中的另一个函数。例如,如果用Visual C++的DumpBin工具来查看Windows的Kernel32.dll,那么我们会看到类似下面的输出:C:\Windows\System32>DumpBin -Exports Kernel32.dll (some out...原创 2020-04-30 22:33:50 · 1239 阅读 · 1 评论 -
应用篇之extern“C”
基本概念 C++的项目源码中,经常会看到下面的代码:#ifdef __cplusplusextern "C" {#endif /*...*/ #ifdef __cplusplus}#endif 这里重点介绍extern “C”。在介绍extern "C"之前,简单说下在这里为什么需要#ifdef _cplusplus/#endif _cplusplus。因为C语言中不支...原创 2020-03-05 20:43:43 · 396 阅读 · 0 评论 -
应用篇之dll lib pdb和头文件
建立一个真正的工程时,一般我们都会用到第三库或者自己建的库。这时候我们需要配置用到的头文件、lib以及dll。另外我们建立自己的静态库或者动态库时,会生成lib甚至dll。它们是什么,有什么作用,基本概念 h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。h头文件 文件内容一般是声明,预编译时在包含该头文件的文件里展开(即全部复制过去)。如果没有库的头文件里的声明...原创 2020-03-05 20:37:46 · 3119 阅读 · 0 评论 -
Effective C++之9.杂项讨论
条款53:不要轻忽编译器的警告严肃对待编译器发出的警告信息。努力在你的编译器的最高警告级别下争取“无任何警告”的荣誉。不要过度依赖编译器的报警能力,因为不同的编译器对待事件2地态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。class B{public: virtual void f() const; };class D : public B{...原创 2020-01-31 19:34:44 · 166 阅读 · 0 评论 -
Effective C++之2.构造析构赋值运算
条款05:了解C++默默编写并调用哪些函数编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。条款06:如不想使用编译器自动生成的函数,就应该明确拒绝为了驳回编译器暗自提供的机能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class 也是一种做法。不过C++11开始,可...原创 2020-01-31 15:53:16 · 179 阅读 · 0 评论 -
Effective C++之1.让自己习惯C++
条款01:视C++为一个语言联邦C++高效编程守则视状况而变化,取决于你使用C++哪一部分。C、Object-Oriented C++、Template C++和STL。条款02:尽量以const,enum,inline替换#define对于单纯常量,最好以const对象或enums替换#define。class GamePlayer{private: static const in...原创 2020-01-31 15:51:21 · 182 阅读 · 0 评论 -
应用篇之DLL的静态调用和动态调用
区别静态调用(static call)和动态调用(dynamic call)。静态调用 静态调用,即 Load-time Dynamic Linking。正如我们常用的配置方式,同时需要头文件、LIB和DLL文件,缺一不可。动态调用 &...原创 2020-01-31 15:44:42 · 2573 阅读 · 1 评论 -
应用篇之创建和使用动态链接库DLL
强烈建议看微软官方文档。动态链接库DLL DLL(在基于 UNIX 的操作系统中也称为共享库)是最有用的一种 Windows 组件。 可以将其用作一种共享代码和资源的方式,以及缩减应用的大小。 DLL甚至可以使应用程序更易于维护和扩展。与静态链接的库一样,DLL 按名称_导出_变量、函数和资源。 ...原创 2019-10-15 22:21:22 · 217 阅读 · 0 评论 -
应用篇之创建和使用静态库
强烈建议看微软官方文档。静态库 使用静态库(.lib 文件)是重用代码的一种绝佳方式。 而不是重新实现同一例程需要一个编写这些功能,每个应用中的时间以静态库,然后从应用中引用它。 从静态库链接的代码成为了应用的一部分,这样你就不必安装另一个文件来使用代码。创建静态库 &n...原创 2019-10-15 22:15:52 · 198 阅读 · 0 评论 -
应用篇之文件读写
关于C++的文件读写,网上有很多资料。这里主要介绍做图像处理时用到的一些情况。从文件(全部是整型)里读取intvector<int> ReadRawData(const string &fileName){ vector<int> rawData; ifstream file(fileName); if (!file.is_open()) ret...原创 2019-10-15 22:10:24 · 278 阅读 · 0 评论 -
C语言头文件介绍
对头文件详细的了解,是因为VS编程时出现:error LNK2005: "int i" (?i@@3HA)已经在 2.obj 中定义的错误。 转载的 C语言头文件的使用 ——by janders 里面介绍了头文件的作用:全局变量声明和函数声明。本文介绍头文件,头文件中全局变量的声明一、预备知识1、C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp原创 2014-08-28 16:09:25 · 1161 阅读 · 0 评论 -
C语言头文件的作用
转载: C语言头文件的使用 ——by janders C语言中的.h文 件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐认识清楚他的本来面目。揪其原因,我的 驽钝和好学而不求甚解固然是原因之一,但另外还有其他原因。原因一:对于较小的项目,其作用不易被充分开发,换句话说就是即使不知道他的详细使用方法,转载 2014-08-24 08:53:14 · 470 阅读 · 0 评论 -
C++全局变量的定义和声明
本篇文章是对C++全局变量的声明与定义进行了详细的分析介绍,1、 声明与定义函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;函数或变量在定义时,它就在内存中有了实际的物理空间。基本类型变量的声明和定义(初始化)是同时产生的;而对于对象来说,声明和定义是分开的。例如:类A如果A a;就是一个声明,告诉编译器a是A类的一个对象变量,但是不进行初始原创 2014-08-28 16:10:15 · 1906 阅读 · 0 评论 -
error C2027: useof undefined type 'A' see declaration of 'A'
error C2027: use of undefined type 'A' see declaration of 'A'原创 2015-10-28 09:06:39 · 2174 阅读 · 0 评论 -
使用devenv在命令行中编译项目
本文介绍如何使用命令行运行Visual Studio编译项目。一、devenv介绍 devenv是VisualStudio的可执行程序,一般在“..\Microsoft Visual Studio 12.0\Common7\IDE”下,用于运行Visual Studio。 使用devenv来编译项目的实例:devenv D:\Build\MyProject\Src\MyProject.sln原创 2017-03-23 19:50:40 · 13397 阅读 · 2 评论 -
C++之main函数
每个程序必须有main函数,而且只能有一个。1、形参int main(int argc, char *argv[]) { ... } 第二个形参argv是一个数组, 它的元素是指向C风格字符串的指针;第一个形参argc表示数组中字符串的数量。 当实参传给main函数之后,argv的第一个元素指向程序的名字或者一个空字符串,接下来的元素依次传递命令行提供的实参。所以当使用a...原创 2018-03-25 21:48:07 · 10355 阅读 · 0 评论 -
事件驱动编程
大多数基于窗口的程序,一个显著的特征是事件驱动。这意味着程序要响应不同的事件,如单机鼠标、按下键盘上的按键,或者重新调整窗口的大小。系统自动管理事件队列,该队列接收到已经发生的特定事件信息,并按照先来先服务的顺序处理这些信息。程序员将程序组织成回调函数的集合,这些回调函数一有事件发生就执行。当回调函数执行完后,应用程序从队列移走响应的消息,再从调用处恢复成等待状态。程序员必须在每个回调函数内部编写...原创 2016-11-13 19:51:35 · 3058 阅读 · 0 评论 -
Boost库
一、Boost库 Boost库是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化。不过对比STL,boost更加实用。STL集中在算法部分,而boost包含了不少工具类,可以完成比较具体的工作。  ...原创 2018-10-13 10:34:48 · 281 阅读 · 0 评论 -
回调函数C++11
什么是回调函数(Callback Function)回调函数就是一个通过函数指针调用的函数。我们是通过这个函数指针来调用其指向的函数,这就是我们说的回调机制(Callback)。为什么使用回调机制(Callback)原因一:使用回调机制可以编写与被调用函数中的逻辑无关的通用代码,并且可以被不同的回调重复使用。标准算法库的许多功能都使用回调。例如,该for_each算法对迭代器范围内的每项应...原创 2018-12-10 22:05:27 · 3290 阅读 · 0 评论 -
避免头文件重复包含
一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含。我们可以使用编译预处理命令避免这种情况的发生。 例如,你想确保头文件max.h不会被重复包含,则你可以采取如下的形式: 第一条预处理命令是说,如果MAXMIN_H不原创 2014-08-28 16:05:35 · 853 阅读 · 0 评论