`
vyloy
  • 浏览: 80385 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

C++宏#号的用法

    博客分类:
  • C++
阅读更多
1. #:在宏展开的时候会将#后面的参数替换成字符串,如:
          #define p(exp) printf(#exp);
       调用p(hello)的时候会将#exp换成”hello”

The # operator should not be confused with the null directive.

Use the # operator in a function-like macro definition according to the following rules:

  • A parameter following # operator in a function-like macro is converted into a character string literal containing the argument passed to the macro.
  • White-space characters that appear before or after the argument passed to the macro are deleted.
  • Multiple white-space characters imbedded within the argument passed to the macro are replaced by a single space character.
  • If the argument passed to the macro contains a string literal and if a \ (backslash) character appears within the literal, a second \ character is inserted before the original \ when the macro is expanded.
  • If the argument passed to the macro contains a " (double quotation mark) character, a \ character is inserted before the " when the macro is expanded.
  • The conversion of an argument into a string literal occurs before macro expansion on that argument.
  • If more than one ## operator or # operator appears in the replacement list of a macro definition, the order of evaluation of the operators is not defined.
  • If the result of the macro expansion is not a valid character string literal, the behavior is undefined.


Example: # operator

The following examples demonstrate the use of the # operator:

   #define STR(x)        #x
   #define XSTR(x)       STR(x)
   #define ONE           1

Invocation Result of Macro Expansion
STR(\n "\n" '\n') "\n \"\\n\" '\\n'"
STR(ONE) "ONE"
XSTR(ONE) "1"
XSTR("hello") "\"hello\""



2. ##:将前后两个的单词拼接在一起。例如《The C Programming Language》中的例子:
          #define cat(x,y) x##y
       调用cat(var, 123)展开后成为var123.
3. #@:将值序列变为一个字符
          #define ch(c)  #@c
       调用ch(a)展开后成为’a’.


ref:
http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/index.jsp?topic=/com.ibm.etools.iseries.langref.doc/ilcrefer17.htm
http://www.trueeyu.com/?p=505

作者:翁志艺
分享到:
评论

相关推荐

    【C/C++】#ifndef,#define用法

    C/C++ 中 #ifndef 和 #define 的用法 #ifndef 和 #define 是 C 语言中的两个重要命令,它们在实际编程中扮演着重要角色。#ifndef 命令用来判断一个宏是否已经定义,而 #define 命令则用来定义一个宏。下面我们将...

    [c、c++]宏中#和##的用法(zz).docx

    在C/C++编程语言中,宏是一种预处理器功能,用于在编译时替换文本。宏中的`#`和`##`运算符具有特殊的用途,它们在处理宏参数时起到关键作用。 `#`运算符被称为“字符串化”运算符。当`#`前面是一个未展开的宏参数时...

    C++中#include、#pragma的含义

    在这些预处理指令中,`#include` 和 `#pragma` 是两个最常用的指令,本文将详细介绍它们的含义和使用方法。 #include 指令 `#include` 指令是 C++ 中最基本的预处理指令,用于引入头文件(Header File)。头文件是...

    C/C++ 宏详解(详解)

    C/C++ 宏是编程语言中的预处理器指令,它们允许程序员在编译...理解宏的工作原理以及如何正确使用它们是C/C++编程中不可或缺的一部分。在适当的时候利用宏的优点,同时避免其潜在的问题,是成为高效C/C++程序员的关键。

    浅析c++ 宏 #val 在unicode下的使用

    在C++编程中,宏是一种预处理器特性,用于在编译期间进行文本替换。`#`操作符在宏定义中有着特殊的作用,它被称为“字符串化”操作符,可以把一个标识符转换为对应的字符串字面量。这对于在调试或者日志记录时非常...

    c/c++宏定义 宏定义的入门教材 基础

    ### C/C++宏定义基础知识详解 #### 一、引言 在C/C++编程语言中,宏定义是一种非常实用的功能,它可以用来简化代码编写过程,提高编程效率,并且有助于代码的可读性和维护性。本文将详细介绍C/C++中的宏定义基础...

    c与c++头文件兼容宏定义

    这种方法的核心思想是在C++代码中使用`extern "C"`关键字来显式地指定C语言的链接约定。具体步骤如下: ```cpp #ifdef __cplusplus extern "C" { #endif // 函数声明 void myFunction(); #ifdef __cplusplus } #...

    c++宏定义技巧

    根据提供的文档标题、描述以及部分代码内容,我们可以总结出关于C++宏定义的一些实用技巧,特别是涉及到了“#”和“##”的操作符在宏定义中的应用。下面将详细解析这些知识点。 ### C++宏定义基础 在C++中,宏是一...

    c++中的宏、内联函数和宏的比较

    在C++编程中,宏和内联函数是提高代码效率和可读性的两种常见方法。它们各自有着不同的应用场景和特点,了解这些差异对于编写高质量的C++代码至关重要。 #### 宏(Macro) 宏是一种预处理器指令,它可以在编译前对...

    #indef 与#define 区别于用法

    3. **宏的命名**:宏的命名应遵循一定的规则,如使用大写字母,前后加上下划线等,以避免与程序中其他标识符冲突。 通过上述讨论可以看出,正确地使用 `#ifndef` 和 `#define` 可以有效地避免重复定义的问题,同时...

    c++基本教程,介绍了c++的基本使用方法

    C++的基本使用方法包括以下几个关键概念: 1. **语法基础**:C++的语法与C语言非常相似,包括变量声明、数据类型(如int、float、char等)、控制结构(如if语句、for循环、while循环)、函数定义和调用。 2. **类...

    C++预编译指令用法

    当你不再需要某个宏,或者想要改变其定义时,可以使用 `#undef`。例如,如果你有一个宏 `TRACE` 用来记录调试信息,你可以先定义它,然后在某些情况下取消定义,以便在不需要追踪的地方节省资源。在给出的代码示例中...

    ARM 编译器为 C 和 C++ 预定义的宏

    ARM编译器为C和C++语言提供了预定义的宏,这些宏在编程时起到了关键作用,帮助程序员更好地适配硬件特性和优化代码。下面将详细介绍ARM编译器预定义的宏及其应用。 首先,预定义宏是编译器在编译过程中自动插入到源...

    #define 宏定义的一些用法总结

    ### #define宏定义的一些用法总结 #### 一、引言 在C及C++编程中,`#define`是一个非常强大的预处理器指令,用于创建宏。宏可以在编译前阶段替代代码片段,提高代码的复用性与可维护性。本文将详细探讨`#define`的...

    利用宏简化配置文件读写的类

    在C++中,使用宏可以实现代码的预处理,通过宏定义,我们可以创建模板化的函数或类,以处理配置文件中的键值对。宏可以避免重复的代码,并提供了一种方式来抽象出通用的读写操作,使得代码更加模块化。 配置文件...

    c++中#include lt;gt;与#include的区别详细解析

    所以像标准的头文件 stdio.h、stdlib.h等用这个方法。 而””首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于include自定义的头文件,让系统优先使用当前目录中定义的。 然后是使用习惯的问题:...

    常用宏定义#define

    下面我们将详细探讨`#define`宏定义的各种应用场景及其使用方法。 1. **常量定义**: 使用`#define`可以方便地定义常量,避免使用`const`关键字时产生的对象。例如: ```c #define PI 3.14159 ``` 在之后的...

    超级马里奥(c++源码大更新)

    - **作用**:这是一个包含了C++标准库中的大多数头文件的宏文件。 - **注意事项**: - 这个头文件并不是所有编译器都支持的标准头文件,它可能只在某些特定的编译器(如GCC)中可用。 - 使用此头文件可能会导致...

    Python C++ and SWIG

    这种方法使得 Python 程序员可以在需要的地方调用 C 或 C++ 的库函数,而无需对整个程序架构进行大规模重构。 - **SWIG 的作用**:SWIG 能够自动生成用于连接 C/C++ 库的 Python 接口文件。这些接口文件可以被编译...

Global site tag (gtag.js) - Google Analytics