如何使用一个宏的值作为参数传递给另一个宏?

// 宏中的#号是字符串化的意思,就是说把宏参数看成一个字符串。
// 但是考虑另一种需求:我们要字符串化的参数很长,我们想用另外一个宏代替这个参数。
//                     这样的话,你字符串化会有问题,
//                     字符串化的是另一个宏的名字,而不是宏的值。
// 这就出现了本篇要讨论的问题:如何使用一个宏的值作为参数传递给另一个宏?
// 方法就是:宏传参给宏,具体的解释看代码注释。
#include <stdio.h>

int main(int argc, char *argv[])
{
#define WARN_IF(EXPR) do {     if (EXPR)     fprintf(stderr, "Warning: " #EXPR "\n"); } while(0)

    int divider = 0;
    WARN_IF(divider == 0);

#define CHR \xe2\x97\x8f
#define PASSWD(x) #x#x#x#x#x#x
#define MASK(str) PASSWD(str)
// 你本以为定义2个宏就能完成的功能,PASSWD(CHR),但是并不能完成。
// 那你就再定义一个解释参数的宏,这样就ok了。
// 传给MASK的参数是CHR,但是PASSWD调用的却是CHR的值。
// 因为宏CHR被展开了。
// 这就叫宏传参给宏。
    printf("passwd:%s\n", MASK(CHR));

    return 0;
}
时间: 2024-10-05 16:13:28

如何使用一个宏的值作为参数传递给另一个宏?的相关文章

gcc编译期打印宏的值

如果我们想知道一个宏的值应该怎么办? 要么在代码里加一句printf 要么在编译的时候gcc -E 第一种方法需要程序运行起来,颇为麻烦 第二种方法无法应付下面这些情况 比如宏的值等于sizeof(struct xxoo) 比如宏本身就是一个复杂的运算(((2U) << (((0+8)+8)+13)) | ((('W')) << (0+8)) | (((7)) << 0) | (((((sizeof(int) == sizeof(int[1]) && s

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序

[问题] 找出反序的个数 给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序. 即:数组a[]; 对于i < j 且 a[i] > a[j],则称这是一个反序. 给定一个数组,要求写一个函数,计算出这个数组里所有反序的个数. [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> int sumNum = 0; void merge(int *a,

php内核为变量的值分配内存的几个宏

在php5.3之前,为某变量分配内存是用宏 MAKE_STD_ZVAL; 737 #define MAKE_STD_ZVAL(zv) \ # /Zend/zend.h738 ALLOC_ZVAL(zv); \739 INIT_PZVAL(zv); 165 #define ALLOC_ZVAL(z) \ # /Zend/zend_alloc.h166 (z) = (zval *) emalloc(sizeof(zval)) 727 #define INIT_PZVAL(z) \          

代码实现:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字

import java.util.Scanner; /*题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字. 例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制. 程序分析:关键是计算出每一项的值.*/ public class Test08 { public static void main(String[] args) { System.out.print("请输入a:"); int a = inNumber(); Sys

用javascript在客户端删除某一个cookie键值对

下面这个方法展示如何在客户端浏览器上用javascript删除某一个cookie键值对. //用javascript删除某一个cookie的方法,该方法传入要删除cookie的名称 function RemoveCookie(cookieName) { var cookies = document.cookie.split(";");//将所有cookie键值对通过分号分割为数组 //循环遍历所有cookie键值对 for (var i = 0; i < cookies.leng

sql server 获取每一个类别中值最大的一条数据

sql server 获取每一个类别中值最大的一条数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1--b的第一个

获取下拉框第一个选项的值、最后一个选项的值、第二个选项的值

//假设网页里有下面这样一个下拉框 <select id="angelweb"> <option value=1>1</option> <option value=2>2</option> <option value=3>3</option> <option value=4>4</option> <option value=5>5</option> <

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。

一.第一种写法 package com.pb.demo1; import java.util.Scanner; /** * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加), * a以及累加数的位数是从键盘接收. 程序分析: * 1. 接收从键盘输入的一个数(数字只能是1-9之间的数) * 2. 接收一个数表示累加数的位数 * 3.例如,输入一个4(累加数的位数),键盘输入a的值是5:s=5+55+555