0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++编程中带#条件语句的用法和作用详解

C语言专家集中营 2017-12-11 16:18 次阅读

1#和##的作用和用法

C/C++ 的宏中,#的功能是将其后面的宏参数进行字符串化操作,简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。##连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。

#include using namespace std;#define WARN_IF(EXP) if(EXP) cerr << #EXP << endl;#define paster( n ) cout << "token" << #n << " = " << n << endl;#define _CONS(a, b) int(a##+##b)#define _STRI(s) #svoid main() {    int div = 0;    WARN_IF(div == 0);           // prints : div == 0    paster(9);                   // prints : token9 = 9    cout << _CONS(1, 2) << endl;     // prints : 3    cout << _STRI(INT_MAX) << endl;  // prints : INT_MAX}

凡是宏定义里有用#或##的地方宏参数是不会再展开,例如_STRI(INT_MAX)中的INT_MAX就不会被展开为2147483647。如果想要使其中的宏参数展开,则需要多加一层中间转换宏:

#define STRI(s) _STRI(s)cout << STRI(INT_MAX) << endl; // prints : 2147483647

加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的宏就能得到对应的宏参数。

接下来,我们来了解通过预处理指令创建条件编译参数控制代码编译的一些用法。

2#include的用法

包含头文件的操作,通常有两种格式:

#include #include "header-file"

<>和""表示编译器在搜索头文件时的顺序不同:

<>表示从系统目录下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录

""是表示从当前目录开始搜索,然后是系统目录和PATH环境变量所列出的目录。

所以,系统头文件一般用<>,用户自己定义的则可以使用"",加快搜索速度。除此外,写代码多了就会发现,有些头文件之间的相互包含是有隐藏依赖关系的,一定要加以注意。Google C++ Style Guide中也强调使用标准的头文件包含顺序可增强可读性, 避免隐藏依赖:

1 相关文件(优先位置,如dir2/foo2.h)2 C系统文件3 C++ 系统文件4 其他库的.h文件5 本项目内.h文件

3#if,#elif,#else,#endif用法

// structure 1#if constant_expression#else#endif// structure 2#if constant_expression#elif constant_expression#endif

这里的结构跟常见的if...else和if...else if...else语句类似,当#if后的条件为非零(true)时,编译#if和#else或#elif之间的代码,否则编译#else和#endif之间的代码(或者判断#elif后的条件是否非零(true),决定是否编译#elif和#endif之间的代码)。

#if 1 cout << "Hello world!" << endl;#else    cout << "Nice to meet you!" << endl;#endif// prints : Hello world!

#if 1 cout << "Hello world!" << endl; #elif 1    cout << "Nice to meet you!" << endl; #endif// prints: Hello world!//      Nice to meet you!

4#define,#undef,#ifdef,#ifndef用法

#define是大家都常见的宏定义方法,用法结构为:

// #define identifier replacement-code#define PI 3.1415926#define ADD(x,y) (x + y)

#undef顾名思义,就是从该处取消前面已经定义的宏,如果标识符当前没有被定义称为一个宏名称,就会忽略该指令:

// #undef identifier#undef PI

#ifdef和#ifndef含义相反,前者含义为如果定义了该宏,则编译相应代码;后者则为如果没有定义该宏,则编译相应代码。通用结构为:

/* * #ifdef identifier * #else or #elif * #endif **/ #define DEBUG#ifdef DEBUG cout << "This is a debug message." << endl;#endif// prints : This is a debug message./* * #ifndef identifier * #else or #elif * #endif **/ #ifndef DEBUG  cout << "This is a debug message." << endl;#endif// prints nothing

编程时,为了避免头文件重定义,经常使用的就是#define配合条件编译解决:

#ifndef MY_HEADER_FILE_H#define MY_HEADER_FILE_H// ...class MyHeaderFile { // ....};#endif // MY_HEADER_FILE_H

除此以外,还有#pragma once的用法,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。(在所有的预处理指令中,#pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作,本文不多讲述。)

5#line用法

#line命令是用于更改__LINE__和__FILE__变量的值。__FILE__和__LINE__描述被读取的当前文件和所在行数。

// #line line-number filenameint main() {#line 10 "main.cpp" cout << __FILE__ << " " << __LINE__ << endl; }// prints : main.cpp 10

6#error用法

#error会直接导致程序停止编译并输出指定的错误信息

// #error message#ifndef VERSION#error Version number not specified.#endif// The compiler will halt compiling and return with the specified error message: // fatal error C1189: #error : Version number not specifi

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136129

原文标题:C++ "#"的作用和用法

文章出处:【微信号:C_Expert,微信公众号:C语言专家集中营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中if语句、if-else语句和switch语句详解

    C语言中,有三种条件判断结构:if语句、if-else语句和switch语句
    发表于 08-18 16:36 1.2w次阅读
    <b class='flag-5'>C</b>语言中if<b class='flag-5'>语句</b>、if-else<b class='flag-5'>语句</b>和switch<b class='flag-5'>语句</b><b class='flag-5'>详解</b>

    Rust的 match 语句用法

    执行不同的代码,这在处理复杂的逻辑时非常有用。在本教程,我们将深入了解 Rust 的 match 语句,包括基础用法、进阶用法和实践经验等方面。 基础
    的头像 发表于 09-19 17:08 883次阅读

    CC++const的用法比较

    为0)。针对Cconst的上述局限性,C++作出了重大的改进。在C++,可以使用const来定义常数,因为const在编译器的控制范畴内
    发表于 11-11 10:00

    浅谈C语言goto语句用法

    今天一起来分析C语言,goto语句用法。goto语句用法goto语句,为无
    发表于 05-06 09:16

    C++语言基础讲解视频do while循环语句

    C++语言基础讲解视频do while循环语句
    发表于 01-14 15:32 5次下载

    C++语言基础讲解视频Switch分支条件判断语句

    C++语言基础讲解视频Switch分支条件判断语句
    发表于 01-14 08:00 7次下载

    C++语言基础讲解视频while循环语句

    C++语言基础讲解视频while循环语句,喜欢的朋友可以下载来学习。
    发表于 01-14 15:31 3次下载

    浅谈关于DSP6000C/C++语言和汇编语言的混合编程的方法

    一、混合编程的方法主要有以下几种: (1)独立编写C语言程序和汇编程序,分别编译形成各自的目标代码块, 然后用连接器将两种模块连接起来。 (2)直接在C/
    发表于 10-24 10:10 1次下载

    C++语言程序设计时如何控制语句?

    本文档的主要内容详细介绍的是C++语言程序设计时如何控制语句?内容包括了1 C++语句概述2 if语句实现选择结构3 switch
    发表于 09-20 14:51 2次下载
    <b class='flag-5'>C++</b>语言程序设计时如何控制<b class='flag-5'>语句</b>?

    C++程序设计教程之语句的详细资料说明

    本文档详细介绍的是C++程序设计教程之语句的详细资料说明主要内容包括了:1.说明语句 ( Declarative Statements ) ,2.条件
    发表于 02-28 11:11 1次下载
    <b class='flag-5'>C++</b>程序设计教程之<b class='flag-5'>语句</b>的详细资料说明

    C语言和C++的特点与用法详细说明

    本文档的主要内容详细介绍的是C语言和C++的特点与用法详细说明。
    的头像 发表于 12-26 10:58 4364次阅读

    条件判断语句(if语句

    条件判断语句,作为任何编程语言都不可缺少的内容,在C语言中也不例外。条件判断语句可以让程序的功能
    的头像 发表于 02-21 15:24 3374次阅读
    <b class='flag-5'>条件</b>判断<b class='flag-5'>语句</b>(if<b class='flag-5'>语句</b>)

    详解Python条件语句

    在 Python ,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。
    的头像 发表于 04-19 15:39 777次阅读

    C++ std::tie函数的作用用法

    C++std::tie函数的作用就是从元素引用中生成一个tuple元组,其在头文件定义
    的头像 发表于 07-18 17:28 806次阅读

    assign语句和always语句用法

    用法和功能。 一、Assign语句 Assign语句的定义和语法 Assign语句用于在HDL连续赋值,它允许在设计
    的头像 发表于 02-22 16:24 2279次阅读