宏定义

关于嵌套宏的使用

◇◆丶佛笑我妖孽 提交于 2019-11-29 10:14:01
2011-12-04 wcdj 问题 :下面通过宏定义实现一个可以指定前缀的字符串。 PREFIX+".%d" 方法1 :使用#运算符。出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。 #include<cstdio> #define PREX 1.3.6 #define FORMAT(n) #n".%d\n" int main() { int ival = 246; printf(FORMAT(PREX), ival);// PREX.246 return 0; } 但是输出结果是:PREX.246,和预期的结果不一样,宏PREX作为宏FORMAT的参数并没有替换。那么如何让FORMAT宏的参数可以替换呢? 首先,C语言的宏是允许嵌套的,其嵌套后,一般的展开规律像函数的参数一样:先展开参数,再分析函数,即由内向外展开。但是,注意: (1) 当宏中有#运算符时,参数不再被展开; (2) 当宏中有##运算符时,则先展开函数,再展开里面的参数; PS: ##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号(非字符串)。 方法2 :修改宏定义的格式,再添加一个中间宏TMP(x)实现对参数的替换,然后再替换为最终想要的字符串。 #define PREX 1.3.6 #define FORMAT(x) TMP(x)

#error 宏定义

╄→尐↘猪︶ㄣ 提交于 2019-11-29 10:10:15
宏定义#error #error token-sequence 其主要的作用是在编译的时候输出编译错误信息token-sequence 从方便程序员检查程序中出现的错误。 该指令用于程序的调试, 当编译中遇到#error指令就停止编译。 #define CONST_NAME "const name" printf("%s\n",CONST_NAME); #undef CONST_NAME #ifndef CONST_NAME #error No defined Constant Symbol CONST_NAME #endif 来源: CSDN 作者: steven_yzx 链接: https://blog.csdn.net/yangzhongxuan/article/details/7777904

C语言宏#和##

怎甘沉沦 提交于 2019-11-29 10:09:01
C语言宏#和## 一、基本用途 #用于将宏定义中的参数转换为字符串。 例:存在宏#define TO_STRING(x) #x 则TO_STRING(hello)展开为"hello" ##用于拼接Token。 例:存在宏#define DECLARE_HANDLER(x) x##_handler 则DECLARE_HANDLER(foo)展开为foo_handler 二、打印出展开后的宏 #define TO_STRING(x) #x #define MACRO_TO_STRING(macro) TO_STRING(macro) 宏MACRO_TO_STRING将宏转换为字符串 例: #define FOO_1(n) int a##n; cout << MACRO_TO_STRING(FOO_1(1)) << endl; 将输出int a1; 三、宏参数替换中的#和## Unicode下文件名的宏定义如下: #define WIDEN2(x) L##x #define WIDEN(x) WIDEN2(x) #define __WFILE__ WIDEN(__FILE__) 为什么不直接定义#define __WFILE__ WIDEN2(__FILE__)呢?这篇博文也是为此而生。 先来看看展开的结果: 将MACRO_TO_STRING(__WFILE__)打印出来结果为 L"D:

GNU C语言 宏定义 #args ##args

亡梦爱人 提交于 2019-11-29 10:07:20
文章转自:http://blog.chinaunix.net/uid-21830881-id-1813972.html 如果大家看到,下记代码,一些人一定会有一些疑问 # define DBG_OUTPUT ( fmt , args . . . ) printf ( "CK File[%s:%s(%d)]:" fmt "\n" , __FILE__ , __FUNCTION__ , __LINE__ , # # args ) args...是什么? ##args 是什么? 如何应用? 如何传递? .......... ①args... GCC编译器中的CPP预编译器,是支持这种写法的,args... 比 args,... 的写法可读性较好。 含义:应该是DBG_OUTPUT的参数,第一个传给fmt, 第二个开始传给args...可为多个。 ②##args ##args的意思,就是把args...中的多个参数,串连起来。 另外,如果写成 #fmt的话,就是把fmt传进来的内容以字符串形式输出。(下面例子中会说明) 例代码① # include < stdio . h > # define DBG_OUTPUT ( fmt , args . . . ) printf ( "CK File[%s:%s(%d)]:" fmt "\n" , __FILE__ , __FUNCTION__ ,

C语言宏定义中的#,##,#@及\符号的作用

我的梦境 提交于 2019-11-29 10:06:45
1、# (stringizing)字符串化操作符 作用:将宏定义中的传入 参数名 转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 如: #define example( instr ) printf( "the input string is:\t%s\n", #instr ) #define example1( instr ) #instr 当使用该宏定义时: example( abc ); // 在编译时将会展开成:printf("the input string is:\t%s\n","abc"); string str = example1( abc ); // 将会展成:string str="abc"; 注意, 对空格的处理: a、忽略传入参数名前面和后面的空格。 如:str=example1( abc ); 将会被扩展成 str="abc"; b、当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串之间以一个空格连接,忽略剩余空格。 如:str=exapme( abc def); 将会被扩展成 str="abc def"; 2、## (token-pasting)符号连接操作符 作用:将宏定义的多个形参转换成一个实际 参数名 。 如: #define exampleNum( n ) num#

C++常量的定义以及宏定义 #define 和常量 const 的区别

送分小仙女□ 提交于 2019-11-29 06:02:50
定义常量 在 C++ 中,有两种简单的定义常量的方式: 使用 #define 预处理器。 使用 const 关键字。 #define 预处理器 下面是使用 #define 预处理器定义常量的形式: #define identifier value 具体请看下面的实例: 实例 #include < iostream > using namespace std ; #define LENGTH 10 #define WIDTH 5 #define NEWLINE '\ n ' int main ( ) { int area ; area = LENGTH * WIDTH ; cout << area ; cout << NEWLINE ; return 0 ; } 当上面的代码被编译和执行时,它会产生下列结果: 50 const 关键字 您可以使用 const 前缀声明指定类型的常量,如下所示: const type variable = value; 具体请看下面的实例: 实例 #include < iostream > using namespace std ; int main ( ) { const int LENGTH = 10 ; const int WIDTH = 5 ; const char NEWLINE = '\ n '; int area ; area =

如何在C中定义多行宏定义?

落爺英雄遲暮 提交于 2019-11-29 05:44:08
请参阅下面的示例,其中我将交换两个变量的值。 do-while(0)结构很不错 #include <stdio.h> #define swap(x,y,T) do { \ T temp = (*x);\ (*x) = (*y); \ (*y) = temp; \ } while (0) int main(void) { int a = 5; int b = 9; printf("Value of a and b before swaping\n"); printf("a = %d\n",a); printf("b = %d\n",b); //Swap the number swap(&a,&b,int); printf("\n\nValue of a and b After swaping\n"); printf("a = %d\n",a); printf("b = %d\n",b); return 0; } 来源: https://blog.csdn.net/liming0931/article/details/100531803

#undef取消宏定义

北慕城南 提交于 2019-11-29 04:41:16
  如果你想定义这个宏那就#define X   如果你不想让你已经#define X的宏在其他地方由于引入这个包含宏定义的.h文件而引起一些编译问题,那你就#undef X掉,就这么简单。   举个简单的例子:   有1.c,11.h,12.h三个文件,其中在11.h中定义了#define X extern   x int a;   而在12.h中你又定义了#define X int   x b;   而在1.c中同时包含了这2个头文件,那就会引起一些问题,此时你必须把其中一个#undef掉来确保宏的正常。   #include <stdio.h>   int main(void)   {   #define MAX 200    printf("MAX = %d\n",MAX);   #undef MAX   #define MAX 300    printf("MAX = %d\n",MAX);    return 0;   }    来源: https://www.cnblogs.com/wjq13752525588/p/11453515.html

通过宏定义改变函数

和自甴很熟 提交于 2019-11-29 03:30:38
#ifdef _WIN32 # define sleep(x) Sleep((x)*1000) #endif 直接影响了后面这个函数,导致参数类型不匹配! ...... boost::this_thread::sleep (boost::posix_time::seconds (1)); ...... 来源: https://www.cnblogs.com/wllwqdeai/p/11443573.html

C与C++的宏定义

三世轮回 提交于 2019-11-28 20:17:51
宏  宏(英语:Macro),是一种批量处理的称谓。  #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率。 命令格式: (1)、简单的宏定义: #define <宏名>  <字符串> 例: #define PI 3.1415926 (2)、带参数的宏定义 #define <宏名> (<参数表>) <宏体> 例: #define A(x) x 一个标识符被宏定义后,该标识符便是一个宏名。 这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换, 替换后才进行编译,宏替换是简单的替换。 宏替换发生的时机:  当我们在一个集成的开发环境如Turbo C中将编写好的源程序进行编译时,实际经过了预处理、编译、汇编和连接几个过程。其中预处理器产生编译器的输出,它实现以下的功能: (1)文件包含   可以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处。 (2)条件编译   预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。 (3)宏展开   预处理器将源程序文件中出现的对宏的引用展开成相应的宏 定义,即本文所说的#define的功能,由预处理器来完成。