关于C语言中的一些宏的小知识

关于C语言中的一些宏的小知识

1.##和#

c语言中,##表示把两个宏参数贴合在一起,即,
#define call(x,y) x##y ,执行call(x,y)结果为xy,例如,
int x=2,y=5;
int xy=90;
printf("%d\n",call(x,y));//结果为90

##被称为连接符,用来将两个宏参数连接为一个宏参数。
而单个#的功能是将其后面的宏参数进行字符串化操作,简单地说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号,使其成为字符串。

以上引自百度知道。

但是好像##和#只能用在宏定义中

#include<iostream>
#define fun(a,b) a##b
#define f(x) #x
int main()
{
    int x = 1;
    int y = 2;
    int xy = 5;
    std::cout<<fun(x,y)<<"\n"<<f(xy)<<":"<<xy<<std::endl;
    std::cin>>x;
    return 0;
} 

以上代码运行的结果是:

5
xy:5

很有意思的运算符

时间: 2024-10-12 21:25:27

关于C语言中的一些宏的小知识的相关文章

拿不到想要的offer,只缘身在CV中,关于一些面试小知识

在平时我们面试的过程总总会遇到一些面试官问一些平时我们不怎么注意的问题,当问出来的时候,面试者通常都是一脸懵逼,这和我想象中的不一样阿,怎么不按照套路出牌,当然一些小知识更能体现出你的细心和好学,以下分析20个面试中的小知识,共勉~.·整理的这份PDF有从基础到进阶.含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有.还有辅之相关的视频+学习笔记 (更多完整项目下载.未

面试过程中,你知道这些小知识,将事半功倍

在平时我们面试的过程总总会遇到一些面试官问一些平时我们不怎么注意的问题,当问出来的时候,面试者通常都是一脸懵逼,这和我想象中的不一样阿,怎么不按照套路出牌,当然一些小知识更能体现出你的细心和好学,以下分析20个面试中的小知识,共勉~.·整理的这份PDF有从基础到进阶.含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有.还有辅之相关的视频+学习笔记 (更多完整项目下载.未

C语言中的__LINE__宏

在C语言中,有这么四个预定义的宏: 当前文件: __FILE__ 当前行号: __LINE__ 当前日期: __DATE__ 当前时间: __TIME__ 这4个宏在代码编译的时候,由编译器替换成实际的值或字符串. 下面演示一段代码,编译一个代码: test.c 1 #include <stdio.h> 2 void main() 3 { 4 printf(" %s \n %d \n %s \n %s \n",__FILE__,__LINE__,__DATE__,__TIM

C语言中的调试宏

#ifdef DEBUG #define debug_printf(fmt, ...) printf(fmt, ##__VA_ARGS__) #else #define debug_printf(fmt, ...) #endif 其中##在没有参数的时候去掉前面的","号,否则在没有参数的时候,编译会报错. #include <stdio.h> #ifdef DEBUG #define debug_printf(fmt, ...) printf(fmt, ##__VA_AR

【java解惑】java中那些反常识的小知识(续)

六.Q:请为 i!=0 && i ==-1 提供一个声明,使得其成立. 分析:在布尔表达式(i != 0 && i == -i)中,一元减号操作符作用于 i,这意味着它的类型必须是数字型的:一元减号操作符作用于一个非数字型操作数是非法的.因此,我们要寻找一个非 0 的数字型数值,它等于它自己的负值.NaN 不能满足这个属性,因为它不等于任何数值,因此,i 必须表示一个实际的数字.肯定没有任何数字满足这样的属性吗?嗯, 没有任何实数具有这种属性,但是没有任何一种 Java 数

【java解惑】java中那些反常识的小知识

一.Q:请为 i == i + 1 ;  提供一个声明使得条件成立.  分析:一个数字永远不会等于它自己加 1对吧!如果这个数字是无穷大的又会怎样呢?Java 强制要求使用IEEE二进制浮点数算术标准IEEE 754,它可以让你用一个 double 或 float 来表示无穷大.无穷大加 1 还是无穷大.如果 i 在声明为无穷大那么i == i + 1 就成立.     A:可以用任何被计算为无穷大的浮点算术表达式来声明 i ,例如double i = 1.0 / 0.0; 不过最好是能够利用标

C语言中宏定义使用方法详解

C语言中的宏替换详解 首先看一个问题: #include <stdio.h> #define    PRINT_CLINE()    printf("%d", ______) int main(void) { PRINT_CLINE(); PRINT_CLINE(); return 0; } 在横线处填上适当的代码,使得上面这段代码的输出为34. 我想一般人看到这个问题的时候头脑里都没有明确的思路来解答这个它.我看到这个问题的时候想出了各种办法来解答它,最终还是没有通过编译

简单讲解C语言中宏的定义与使用

宏定义是预编译功能的一种, 预编译又称为预处理, 是为编译做的预备工作的阶段.处理#开头的指令, 比如拷贝 #include 包含的文件代码,#define宏定义的替换,条件编译等. 使用宏定义的好处:使用宏定义的好处:可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改.例如 π 这个常量,我们有时候会在程序的多个地方使用,如果每次使用都重新定义,一来比较麻烦,二来容易出错,所以我们可以把 π 做成宏定义来使用.   语法说明: (1)宏名一般用大写 (2)使用宏可提高程序的通用性

C语言中宏定义(#define)时do{}while(0)的价值(转)

C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值主要体现在: 1. 增加代码的适应性 下面的宏定义没有使用do{...}while(0) #define FOO(x) foo(x); bar(x); 这样宏定义,单独调用不会出现问题,例如: FOO(100) 宏扩展后变成: 1 f