宏定义

MFC宏定义(转载 出处不详)

余生长醉 提交于 2019-12-12 08:30:59
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 很不错的一篇文章,很多不明白的地方在此讲的很清楚,很完整,主要是MFC的宏定义了.站长黑森林推荐! AND_CATCHAND_CATCH AND_CATCH(exception_class,exception _object_point_name) 说明: 定义一个代码块,它用于获取废除当前TRY块中的附加异常类型。使用CATCH宏以获得一个异常类型,然后使用AND_CATCH宏获得随后的异常处理代码可以访问异常对象(若合适的话)已得到关于异常的特别原因的更多消息。在AND_CATCH块中调用THROW_LAST宏以便把处理过程移到下个外部异常框架。AND_CATCH可标记CATCH或AND_CATCH块的末尾。 注释: AND_CATCH块被定义成为一个C++作用域(由花括号来描述)。若用户在此作用域定义变量,那么记住他们只在此作用域中可以访问。他也用于exception_object_pointer_name变量。 ASSERT ASSERT(booleanExpression) 说明: 计算变量的值。如果结构的值为0,那么此宏便打印一个诊断消息并且成讯运行失败。如果条件为非0,那么什么也不做。 诊断消息的形式为: assertion failed in file in line 其中name是元文件名

C++如何使用宏定义来简化代码性能测试 | cpp macro like function to implement a performance profiler

北城余情 提交于 2019-12-12 08:19:03
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文首发于个人博客 https://kezunlin.me/post/65dc693d/ ,欢迎阅读最新内容! cpp macro like function to implement a performance profiler Guide macro expansions #name ===> quote as strings "xxx" ##name, name ===> xxx a ## b ===> concatenate the preceding and following tokens. // #name ===> "xxx" // name, ##name ===> xxx // ##name ===> concatenate // #name ===> quote as strings // a ## b ===> concatenate the preceding and following tokens. #define QUOTE(name) #name #define CONCAT(x,y) x##y // x ## y space in ommited #define MACRO(name) #name "foo" #define MACRO2(name) name "foo"

C/c++——嵌入式常用备忘录

我是研究僧i 提交于 2019-12-10 19:58:39
QQ 1285575001 Wechat M010527 技术交流 QQ群599020441 纪年科技aming GPIO //通用型之输入输出的简称 #pragma once // 比较常用的C/C++预处理指令 // 只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次 #include //指C/C++中包含头文件命令 用于将指定头文件嵌入源文件中 afxtempl.h //数据收集类模板(MFC template-based Collection Classes)的头文件 //用到了lists,maps或者arrays等数据结构 基于模板的(template-based)数据收集类 afxcmn.h //声明了MFC常用的一些控件类(CListCtrl、CProgressCtrl、CToolTipCtrl等) themeutil.h //自动升级服务源 #ifndef // “if not defined” 的简写 宏定义 的一种 // 可以根据是否已经定义了一个变量来进行分支选择,一般用于调试 //预处理功能中三种( 宏定义 ,文件包含和 条件编译 )中的第三种—— 条件编译 #define //预处理指令,其中的“#”表示这是一条预处理命令·。 //凡是以“#”开头的均为预处理命令,“define”为宏定义命令,“标识符”为所定义的宏名 #endif /

C/C++中的内置宏定义及跨平台编程随笔

狂风中的少年 提交于 2019-12-07 04:14:49
ANSI C标准中有几个标准预定义宏(也是常用的): __LINE__:在源代码中插入当前源代码行号; __FILE__:在源文件中插入当前源文件名; __DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间; __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1; __cplusplus:当编写C++程序时该标识符被定义。 其他一些微软的C++编译器内置的宏定义可以参考: http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx 值得一提的是,在MinGW中的g++编译器,实际上也内置了WIN32和_WIN32的宏,这与通常理解的g++编译器用于linux的有些不同,一般不容易想到windows下的g++也会内置WIN32宏,对于编写跨平台的程序就需要注意一下了。 另外,在windows下可以使用 _MSC_VER 这个宏来区分是微软的编译器还是其他种类的编译器。对于使用多种编译器编译程序时使用不同的代码块有用。 来源: oschina 链接: https://my.oschina.net/u/584059/blog/261752

u-boot

冷暖自知 提交于 2019-12-05 17:28:42
1.解压好u-boot后,打开uboot根目录的README文件,在software configuration 里有写明,如果要针对某个单板进行配置,需要执行:make <board_name>_config 其中uboot支持的board_name可以在根目录的include/configs/下查看。 2.makefile 2.1 uboot version确定 (Makefile 24-29行) U_BOOT_VERSION “1.3.4xyz” 1)uboot版本号分为4个级别: VERSION : 主板号 PATCHLEVEL : 次版本号 SUBLEVEL : 再次版本号 EXTRAVERSION : 另外附加的版本信息 这4个用 . 分隔开共同构成了最终的版本号。 2)makefile中版本号最终生成一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号。 Include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所有源目录中没有,但是编译过后的uboot中就有了。它里面的内容是一个宏定义,宏定义的值就是我们在Makefile中配置的uboot版本号。 3)验证方法:自己修改主makefile中几个version有关的变量,然后编译uboot,然后烧录到SD卡中,从SD卡中启动

inline,宏定义,static,extern

梦想与她 提交于 2019-12-05 16:50:17
inline一般用于定义代码简洁,耗时短,不像宏定义是在预编译阶段替换,inline是在汇编阶段替换,效果一样。 一般编译器进行优化的时候会对简短方法进行这种优化,不进行声明也会进行inline,如果显示的声明为inline,会增大最后代码的大小。最终是否优化由编译器决定,这样声明了可以在头文件中定义,不用担心重复定义。 static是告诉链接器,当前文件定义的方法和变量只有当前模块可用,不能被其他的模块使用。 注意,对于 include 方式进行包含的没有影响。 include 实际是对整个文件进行包含。这个一般是对于库与库,或者 .o 与 .o 之间,可见范围由编译器进行分隔。 extern是告诉编译器,如果当前项目没有定义相关的变量, 不需要报错,在链接阶段一定会有相关的定义的。 和static 有些类似,也是使用于模块与模块之间的。 宏定义是在预编译阶段就进行替换。 可以通过 g++ -E source.cpp 的方式查看替换后的代码。 /* [root@localhost definecompile]# g++ -E test.cpp # 1 "test.cpp" # 1 "<built-in>" # 1 "<命令行>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<命令行>" 2 # 1 "test.cpp" */ int

C学习笔记(9)--- 预处理器,头文件,

不问归期 提交于 2019-12-05 06:52:22
1.预处理器: 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。 我们将把 C 预处理器(C Preprocessor)简写为 CPP。 所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。具体的列表可以在网上找到,这里不再复述。 a.几个常用的: #define MAX_ARRAY_LENGTH 20 (所有的MAX_ARRAY_LENGTH 替换为 20) #include <stdio.h> #include "myheader.h" (这两行指令告诉 CPP 从系统库中获取 stdio.h,并添加文本到当前的源文件中。下一行告诉 CPP 从本地目录中获取 myheader.h,并添加内容到当前的源文件中。) b.预定义宏: 不能修改的预定义宏,可以根据情况使用: __DATE__ 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 __TIME__ 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量 __FILE__ 这会包含当前文件名,一个字符串常量。 __LINE__ 这会包含当前行号,一个十进制常量。 __STDC__ 当编译器以 ANSI 标准编译时,则定义为 1。 c

iOS代码混淆----自动

↘锁芯ラ 提交于 2019-12-05 05:57:06
为什么80%的码农都做不了架构师?>>> 1.4版本 来自 猜猜我叫什么_bd1f 的技术支持 来自 Stark1937 的建议 阅读本篇文章,需要先会 class-dump . O(∩_∩)O谢谢。推荐 San心两yi_钟 的安装步骤 先大致解释一下“编译"、"反编译": 编译:就是把千千万万行字符串(也叫代码,或者源文件),变成010101010101(机器码,也叫目标代码) 编译过程:预处理-编译-汇编-链接 我的脚本运行在预处理阶段。 反编译:就是把0101010111110001100(机器码,也叫目标代码),变成千千万万行字符串(也叫代码,或者源文件) 最近三年一直待在银行做App,由于银行对安全要求较高,所以iOS的代码必须要有混淆的措施,初期实施了 念茜姐 的混淆方案,但是领导说,我们要自动混淆,方法名字不能一个一个的添加到func.list中,所以方法名只能从.m和.h文件中抽取了,但是如何屏蔽系统的方法名,暂行的策略是:将自己定义的方法名全部添加一个前缀。 例如 “hsk_funtion1”; “hsk_funtion2”;“hsk_funtion3”; 在Xcode-->Target--->Build Phases--->添加Run Script 添加Run Script 通过class-dump 反编译之后:Appdelegate 效果 通过class

iOS开发系列--代码混淆

柔情痞子 提交于 2019-12-05 05:50:07
由于iOS系统的封闭性,相对于安卓来说,iOS开发过程中代码混淆可能就显得并不是得非有不可了。但是在安全性(可通过 class-dump 反编译暴露出类的方法名)和特殊需求上(例如马甲包的混淆过审)还是有一定需求的! 此脚本借鉴于 kaich/codeobscure 。在使用原作者脚本的过程中,发现了一些BUG和不足,比如正则表达式的判断不准确,生成过多无用的替换宏,需要花费过多时间去人工排错... 由于本人对python并不是很熟,所以只是在原作者的基础上作了一些完善修改。 优化内容: 修改正则表达式,更精准地找出关键词。 替换规则更改:随机字符串==>随机生成2个单词拼接。防止苹果审核过程被误认加入混淆乱码。 增加-k选项,通过ignoreKey.txt文件添加需要过滤的关键词,可避免每次生成都要手动删除部分关键词的麻烦。 增加property关键词、懒加载方法名过滤,减少无用宏的生成。 增加IBAction方法关键词的二次过滤(原脚本存在自定义方法跟IBAction方法重名,无法排除的情况)。 以下内容大部分来源于 kaich/codeobscure 实现原理 其实插件的实现方式十分简单,提取用户编写的文件中的方法名,使用宏定义将其更换为任意的无规则字符串。但这种方式有一些需要注意的点: 对于系统库产生的方法名,不可替换;对于系统使用到的关键字,也不可以替换;否则会报错;

基于ADO的远程Oracle连接

流过昼夜 提交于 2019-12-05 05:27:49
最近在一个通过MFC做一个界面,通过这个界面可以对布置在另一台服务器上的数据库MySQL、SQl Server、Oracle进行增删创建表的操作。其中我通过ADO很快就完成了对MySQL和SQL Server的控制。但是Oracle的连接就麻烦很多,我完成这个项目的大部分的时间都在研究怎么与Oracle数据库互通。 先声明下我的电脑环境,没有装ORACLE客户端,WIN7_64位操作系统,使用的编译器是VC6。服务器用的是WIN10的系统,Oracle的版本为11.2.0.1.0,我客户端安装了 先交代下,我用OTL最终没能成功连接上数据库,最终是用ADO连接上的,以下是我整个踩坑过程中难点的记录。 现有的一些工具有很多,最终考虑先用OTL尝试。 网上很多人说使用OTL只要有一个头文件就够了,而我尝试了只包含OTLV4.H后连编译都通不过,因为还要添加OCI的各种lib库和OCI.dll。 我是先去别的博客推荐的英文网站上下了一个头文件OTLV4.H,结果发现是个坑,里面的代码是错的,怎么都是编译不过的,后来尝试性的去国内的一个网站下载了一个OTLV4.h没想到竟然编译通过了。 然后我又下载了OCI的各种lib库和OCI.dll。 在新建工程中,要把OCI.dll放在编译出来的DEBUG或者RELEASE文件中, 然后在VC6的左上角菜单中project->project