1 概述 在工程规模较小,不是很复杂,与硬件结合紧密,要求移植性的时候,可采用宏定义简化编程,增强程序可读性。 当宏作为常量使用时,C程序员习惯在名字中只使用大写字母。...不要使用宏来定义新类型名,应该使用typedef,否则容易造成错误。 给宏添加注释时请使用块注释(/* */),而不要使用行注释。因为有些编译器可能会把宏后面的行注释理解为宏体的一部分。...尽量使用const取代宏来定义符号常量。...对于较长的使用频率较高的重复代码片段,建议使用函数或模板而不要使用带参数的宏定义;而对于较短的重复代码片段,可以使用带参数的宏定义,这不仅是出于类型安全的考虑,而且也是优化与折衷的体现。...尽量避免在局部范围内(如函数内、类型定义内等)定义宏,除非它只在该局部范围内使用,否则会损害程序的清晰性。
通过cmake添加macro宏定义 出入到源文件,例如在编译opencv/caffe的时候,我们通过cmake -DUSE_CUDA=ON/OFF来确定,是否使用cuda....问题cmake中如何实现上述两个功能的呢? 至于问题1: 我们可能想到直接在头文件中定义,这样也可以,但是如果直接在cmake中定义,然后传递给程序读取生成更加灵活。.../demo11 version: 1.0 ---- 添加macro到src文件中(add_definitions/option) 本实例在cmake中添加macro定义到源文件中,从而选择使用不同的lib...项目目录如下:demo12.cpp根据cmake定义的macro USE_SPECIFIED决定使用模块SpecifiedFun(特定的函数),还是模块CommonFun(一般的函数). ?.../demo12 Select to use common function 使用macro USE_SPECIFIED直接使用cmake ..
一、#define的基本语法 在C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程中,其值不能被改变的量。常量常使用#define来定义。...使用#define定义的常量也称为符号常量,可以提高程序的运行效率。...Microsoft Word中对宏定义为:“宏就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作变得更容易”。...0; } 五、带有副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。...每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。 2. 宏是没法调试的。 3. 宏由于类型无关,也就不够严谨。 4.
本文链接:https://blog.csdn.net/solaraceboy/article/details/102729793 C语言中宏的定义与使用 三种类型的预处理指令 宏定义 宏是比较常用的一种预处理指令...,这里我们主要讨论带参数的宏。...带参数的宏(函数式宏)定义如下: #define EXAMPLE(x,y,z) 替换列表 注意:在宏的名字和左括号之间没有空格。 宏的优点: 程序可能会更快一些; 宏更同意。...宏的缺点: 编译后代码通常会变大。 宏的参数没有类型检查。 无法用指针来指向一个宏。 宏可能会不止一次地计算它的参数。...文件包含 条件编译 适用于预处理指令的规则 指令都以 # 开始 在指令的符号之间可以插入任意数量的空格和水平制表符。 指令总是在第一个换行符处结束,除非明确地指明要延续。
第八章:项目结构 在本章中,我们将涵盖以下配方: 使用函数和宏实现代码复用 将 CMake 源代码拆分为模块 编写一个函数来测试和设置编译器标志 使用命名参数定义函数或宏 重新定义函数和宏...我们选择使用宏而不是函数,因为我们还希望在调用范围内使用宏内部定义的变量来改变消息的颜色。...: include(cmake/colors.cmake) 还有更多 推荐的做法是在模块中定义宏或函数,然后调用宏或函数。...使用模块包含作为函数调用是不好的做法。包含模块不应该做更多的事情,除了定义函数和宏以及发现程序、库和路径。...这种方法为我们提供了实现具有更健壮接口和更易读的函数/宏调用的函数和宏的机会。 还有更多 选项关键字(在本示例中未使用)由cmake_parse_arguments定义为TRUE或FALSE。
参数使用括弧括起 参数之间使用空格或分号分开 指令是大小写无关的,参数和变量是大小写相关的 set(HELLO hello.cpp) add_executable(hello main.cpp hello.cpp...) ADD_EXECUTABLE(hello main.cpp ${HELLO}) 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名 重要指令和CMake常用变量 重要指令 cmake_minimum_required...(VERSION versionNumber [FATAL_ERROR]) project – 定义工程名称,并可指定工程支持的语言 # 指定工程名为HELLOWORLD project(HELLOWORLD...) 语法:project(projectname [CXX] [C] [Java]) set – 显式的定义变量 # 定义SRC变量,其值为main.cpp hello.cpp set(SRC sayhello.cpp...编译流程 在 linux 平台下使用 CMake 构建C/C++工程的流程如下: 手动编写 CmakeLists.txt。
ANSI标准说明了五个预定义的宏名。...需要注意的是凡宏定义里有用"#"或"##"的地方宏参数是不会再展开....A N S I标准说明了五个预定义的宏名。...%s”,date,_LINE_,_FILE_) #else #define DEBUGMSG(msg,date) #endif 20,宏定义防止使用是错误 用小括号包含。..."#"和"##"的用法 一、一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
CMake是一个跨平台的Makefile生成工具,可以根据特定的规则生成相应的Makefile文件,并对C/C++源代码进行编译和管理。...有两篇博客介绍CMake的使用,比较通俗易懂,链接地址是: Cmake 详解 CMake 入门实战 CMake的官方下载地址为:https://cmake.org/download/ 官方文档地址为:CMake...3.16 Documentation 官方的CMake指南地址为:CMake Tutorial 一、CMake中添加对C++11的支持 1、在对应的CMakeLists.txt文件中加入以下语句: add_definitions...}") endif(CMAKE_COMPILER_IS_GNUCXX) 2、延伸 如何写cmake使其包含c++11特性 (-std=c++11如何写进cmakeList.txt) 使用的g++版本和...github上面有一个韩国人jacking75写的简单的cmake使用示例, examples_CMake项目地址是:https://github.com/jacking75/examples_CMake
包含vxWorks.h即可 /* 取双字节变量的高八位 */ #define MSB(x) (((x) >> 8) & 0xff) /* Most Significant Byte */ /*...取双字节变量的低八位 */ #define LSB(x) ((x) & 0xff) /* Least Significant Byte */ /* 取四字节变量的高十六位 */...#define MSW(x) (((x) >> 16) & 0xffff)/* Most Significant Word */ /* 取四字节变量的低十六位 */ #define LSW(x)...((x) & 0xffff) /* Least Significant Byte */ /* 取四字节变量的低八位 */ #define LLSB(x) ((x) & 0xff) /*...取四字节变量的次低八位 */ #define LNLSB(x) (((x) >> 8) & 0xff) /* 取四字节变量的次高八位 */ #define LNMSB(x) (((x) >> 16)
最近写AVG工具时有这样的功能需求,AVG的角色可以支持动态的Spine动画,当没有Spine动画时采用默认的立绘图片替代。...这时在脚本中就可以采用自定义的宏来实现: 例如: #if VNSpine using Spine.Unity; #endif Unity中有专门开启和关闭自定义宏的位置:PlayerSettings-OtherSettings-Configuration-Scripting
在一个宏定义中,编译器可以检测到绝大多数由多余符号所导致的错误。但不幸的是,编译器会将每一处使用这个宏的地方标为错误,而不会直接找到错误的根源——宏定义本身,因为宏定义已经被预处理器删除了。...在宏的名字和左括号之间必须没有空格。如果有空格,预处理器会认为是在定义一个简单的宏,其中(x1,x2,…,xn)是替换列表的一部分。 当预处理器遇到一个带参数的宏,会将定义存储起来以便后面使用。...2) 、预处理器只会替换完整的记号,而不会替换记号的片断。因此,预处理器会忽略嵌在标识符名、字符常量、字符串字面量之中的宏名。...4) 、宏不可以被定义两遍,除非新的定义与旧的定义是一样的。小的间隔上的差异是允许的,但是宏的替换列表(和参数,如果有的话)中的记号都必须一致。 5) 、宏可以使用#undef指令“取消定义”。...宏定义中的do-while循环do do循环必须始终随跟着一个分号,因此我们不会遇到在if语句中使用宏那样的问题了。
编译器都会预定义一些宏,这些宏是不可取消的,来看看VxWorks中可能用到的这几个 __FILE__ 字符串常量,表示当前文件名,包含绝对路径 __LINE__ 十进制整型数,表示当前代码行号的 __FUNCTION...__ 字符串常量,表示当前函数名,但它不是宏 这三个是在调试语句里经常用的,至少是公众号VxWorks567经常用 ?...int的最大值 __LONG_MAX__ signed long的最大值 __LONG_LONG_MAX__ signed long long的最大值 __INTMAX_MAX__ intmax_t的最大值...不建议直接使用这几个宏,而是包含系统的头文件 ?...__TIMESTAMP__ 字符串常量,表示当前文件的最后修改时间,包含星期、月、日、时、分、秒、年,共24个字符 ? 有点意思吧 这正是: 系统几个宏,调试挺好用。 溶于代码中,功能妙无穷。
宏定义了{_project_name}_SOURCE_DIR和{_project_name}_BINARY_DIR,我们使用宏而不是函数,因为{_project_name}_SOURCE_DIR和{_project_name...对于我们当前的目的,名称重整并不是真正的问题。Fortran 2003 标准为函数和子程序定义了一个bind属性,它接受一个可选的name参数。...我们还使用FortranCInterface_HEADER函数来生成包含宏的头文件,以处理 Fortran 子程序的符号修饰。...) 此命令将生成包含符号修饰宏的fc_mangle.h头文件,如 Fortran 编译器所推断,并将其保存到当前二进制目录CMAKE_CURRENT_BINARY_DIR。...由于 Fortran 不区分大小写,子程序可能以小写或大写形式出现,因此需要将两种情况都传递给宏。请注意,CMake 还将为隐藏在 Fortran 模块后面的符号生成修饰宏。
关于定义宏的另外一些问题 (1) 宏可以被多次定义, 前提是这些定义必须是相同的....那么, 如果原先tmp.c中含有MAX宏的定义, 那么再在gcc调用命令中使用-DMAX, 会出现什么情况呢? ---若-DMAX=1, 则正确编译....#if MACRO_NON_DEFINED == #if 0 在判断某个宏是否被定义时, 应当避免使用#if, 因为该宏的值可能就是被定义为0....而应当使用下面介绍的#ifdef或#ifndef. 注意: #if, #elif, #else之后的宏只能是对象宏....gcc定义的预定义宏: __OPTMIZE__ 如果编译过程中使用了优化, 那么该宏被定义为
该宏实现写字符避免写两个单引号的操作。...宏定义: #define MAKE_CHAR(x) #@x 使用: char c = MAKE_CHAR(a); // 让a自动加上两个单引号为'a' 等价于: char c = 'a';
请看下面这段代码: 这是我早期做intel驱动的时候看到intel的驱动工程师写的代码,虽然这两个宏没有实际用途,但细细一看却发现大有用处。...Out_Put_value(IN UAdress Register, OUT Raw_buffer buffer) { _Out_Put_value(Register,buffer); } 这里,IN和OUT的定义可以让代码更容易阅读...,如上,IN表示把数据输入,OUT表示取数据,一个小小的技巧。
本博客旨在自我学习使用,如有任何疑问请及时联系博主 1.WHY?# 当你使用git add .的时候有没有遇到把你不想提交的文件也添加到了缓存中去?...很简单,git为我们提供了一个.gitignore文件只要在这个文件中申明那些文件你不希望添加到git中去,这样当你使用git add .的时候这些文件就会被自动忽略掉。...3.使用方法# 首先,在你的工作区新建一个名称为.gitignore的文件。然后,把要忽略的文件名填进去,Git就会自动忽略这些文件。...如果有些文件已经被你忽略了,当你使用git add时是无法添加的,比如我忽略了*.class,现在我想把HelloWorld.class添加到git中去: $ git add HelloWorld.class...如果我们意外的将想要忽略的文件添加到缓存中去了,我们可以使用rm命令将其从中移除: $ git rm HelloWorld.class --cached rm 'HelloWorld.class' 如果你已经把不想上传的文件上传到了
PHP源码常用代码宏定义: #define 宏名 字符串 #表示这是一条预处理命令,所有的预处理命令都以#开头。define是预处理命令。宏名是标识符的一种,命名规则和标识符相同。...在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。 1....在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。 1....: 在宏定义中使用#用来将宏参数转换为字符串,也就是在宏参数的开头和末尾添加引号。...#define ZEND_FN(name) zif_##name 带参宏定义加连接符,会把ZEND_FN(count) 替换成 zif_count 多表达式宏定义: 在宏定义中使用了 do{ }while
大家好,又见面了,我是你们的朋友全栈君。 Excel宏教程 (宏的介绍与基本使用) Microsoft excel是一款功能非常强大的电子表格软件。...随着支持Windows的应用程序的不断增多和功能的不断增强,越来越多的程序增加了宏处理来方便用户的自由扩展。但初期各应用程序所采用的宏语言并不统一,这样用户每使用一种应用程序时都得重新学习一种宏语言。...为了完成工作,就让我们一起来学习”宏”的妙用吧。 一)、宏的自学 首先需要明确的是,本文不可能教会您关于宏的所有内容。...对录制宏进行修改不仅可以学习宏的使用,还能大大简化宏的编写。 二)、基本概念 为了学习excel中的宏,我们需要先了解以下一些基本概念。...(1,1) Cells(1,2).Select ‘选定B1单元格,使其成为当前单元格 ActiveCell=I+1 ‘以I+1为当前单元格赋值 2、用公式赋值 在宏的使用中,可能会更多地用公式来给单元格赋值
GCC 会为不同 CPU 架构预定义宏,如 __x86_64__ 代表Intel 64位CPU, __aarch64__代表 ARM64。...网上已经有文档对 GCC 为 CPU 的预定义宏进行了总结。 这些预定义的宏有什么用呢?我们在代码中可以判断出当前的 CPU 架构,那么可以针对 不同CPU的特性,进行优化实现。...例如RocksDB 对于获取当前时间,在 x86 平台上,会用到 Time Stamp Counter (TSC) 寄存器,使用 RDTSC 指令提取 TSC 中值。...网上没有搜到 GCC 对龙芯 CPU 的预定宏的文档说明,只能从源码中找答案: void loongarch_cpu_cpp_builtins (cpp_reader *pfile) { ......在暂时不知道龙芯是否支持RDTSC的情况下,只能给出通用的实现,以后再查龙芯的CPU手册进行优化。
领取专属 10元无门槛券
手把手带您无忧上云