首页 > 编程语言 >C/C++中的宏

C/C++中的宏

时间:2024-01-28 17:45:37浏览次数:31  
标签:10 ## C++ int var my CONCAT

目录


"##"预处理运算符

在C++中,## 是一个预处理运算符,被称为“连接符”或“连接运算符”。当它在宏定义中出现时,它将其左右两边的标记(token)连接成一个标记。这在创建宏时特别有用,尤其是当你需要合并两个标记来形成一个新的、有效的标记时。

以下是一些使用 ## 的例子:

基础用法

#define CONCAT(a, b) a ## b  
  
int main() {  
    int xy = 10;  
    int CONCAT(x, y) = 20;  // 这行会产生编译错误,因为宏替换后变成 int xy = 20;,而xy已经定义了。  
    // 注意:这个例子只是为了展示##的语法,并不是一个好的实践。  
}

但是,上面的例子可能不是很有用,因为它可能会导致编译错误(重复定义)。实际上,## 更多地被用于与其他宏参数一起创建新的变量或函数名。

与其他宏参数结合

#define CREATE_VARIABLE(prefix, name) int prefix ## _ ## name = 0;  
  
int main() {  
    CREATE_VARIABLE(my, var);  // 展开为 int my_var = 0;  
}

条件使用
你也可以与其他预处理器命令(如 #ifdef)结合使用,以根据条件连接标记。

#ifdef SOME_CONDITION  
#define CONCAT(a, b) a ## _ ## b  
#else  
#define CONCAT(a, b) a ## b  
#endif  
  
int main() {  
    CONCAT(my, var) = 10;  // 根据SOME_CONDITION的定义,这可能是 int my_var = 10; 或 int myvar = 10;  
}

但请注意,上面的代码片段中存在一个问题:CONCAT(my, var) = 10; 是不正确的,因为 CONCAT(my, var) 会被替换为一个变量名,但你不能直接这样为其赋值。正确的方式是:

int CONCAT(my, var) = 10;

或者先声明再赋值:

CONCAT(my, var) = 10;  // 假设之前已经声明了 my_var 或 myvar

总之,## 是一个强大的工具,但在使用它时需要小心,确保你生成的代码是有效的。

标签:10,##,C++,int,var,my,CONCAT
From: https://www.cnblogs.com/yubo-guan/p/17993063

相关文章

  • C++多线程 第一章 你好,C++并发世界
    第一章你好,C++并发世界C++并发并发(concurrency):主要包括任务切换与硬件并发两类.并发(concurrency)实际上与多线程(multithreading)存在差异.并发的种类任务切换(taskswitching):计算机在某一时刻只可以真正执行一个任务,但它可以每秒切换任务许多次.通过做一......
  • Windows Server 2012 R2 安装 Visual C++ Redistributable (VC_redist.x64) 失败 0x80
    PHP8需要 VisualC++RedistributableforVisualStudio2019,但怎么都装不上,有个0x80240017-未指定的错误。 看日志 Windows8.1-KB2999226-x64.msu好像有补丁安装失败了,网上找到一篇解决办法:https://blog.51cto.com/u_12701820/3032471能成功安装VC,但是PHP8无法......
  • C++类指针未初始化导致访问成员变量时报段错误
    #安装gcc和g++yuminstallgccyuminstallgcc-c++.x86_64//a.cpp#include<iostream>#include<unistd.h>usingnamespacestd;classTest{public:  voidtest1(){  }  voidtest2(){    age=10;  }private:  intage;}......
  • C++线程安全:共享数据的完美守护者
     概述:C++中,为解决线程间共享数据问题,常用互斥锁。通过定义共享数据和互斥锁,编写线程函数,并在操作前使用互斥锁,确保线程安全。在实际应用中,注意选择合适的同步工具和控制互斥锁粒度,提高并发性能。在C++中,线程间共享数据可能会导致竞态条件(RaceCondition)和数据不一致性的问题......
  • py 学习(c++ to py)
    py1:print2024-01-2723:18:57星期六#这里是注释#py1:基础print总结'''aaa有时候也用三个单引号当注释但其实是字符串交互式会输出'''print("helloworld")print("自动换行")print("hello","world","逗号隔开自动空格")pri......
  • 一文总结现代 C++ 中的初始化
    本文尝试回答:现代C++有哪几种初始化形式?分别能够用于什么场景?有什么限制?MyClassobj();为什么没有调用默认无参构造函数创建一个对象?newint和newint()有什么区别?直接初始化、拷贝初始化、列表初始化、默认初始化、值初始化、类内初始值、构造函数初始值列表的区别与......
  • 从C向C++5——友元和string
    一.对象特性(续)1.空指针访问成员函数C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针。如果用到this指针,需要加以判断保证代码的健壮性。如果调用的成员函数不访问成员属性,那么空指针可以调用对应的成员函数,如果该函数涉及了成员属性,那么就相当于涉及了this指针,空......
  • c++实现一门计算机语言到手撸虚拟机实战200节
    1对于编程语言实现原理提供了实战。2学习之后对于JAVA,PHP,PY等语言的实现原理提供了经验平移参考3对JAVA等语言的虚拟机实现原理提供了实战参考。4加深对编程语言的驾驭和深度认知。5虚拟机是计算机系统中非常重要的组成部分,理解了虚拟机的原理和实现方式,从而更好地理解计算......
  • 如果在循环中不改变vector的大小,C++编译器是否会将.size()优化为常数?
      在C++中,可以使用以下代码计算vector<int>中所有元素的和:vector<int>v={1,3,7,9};sums=0;for(inti=0;i<v.size();i++){sums+=v[i];}  这是一段很普通的代码,问题在于:在这段代码中,v.size()会在循环开始前仅计算一次?还是会在每次循环中都计算一次......
  • C转C++速成浅入浅出系列——STL之bitset
    本系列为应付考研复试用,知识浅入浅出,很多地方不深究细节原理;如有谬误,欢迎大家指出。bitset【bitset:位集,比特集】理解为比特集。特点是①只能存入0与1②小端存储(可参阅计算机组成原理知识,表现为按b[i]增序输出时会倒序输出)需提供头文件#include<bitset> 创建注:①存储时......