c语言中字符串比较指令,如何在C条件预处理器指令中比较字符串
CAVEAT:并非所有的编译器都以相同的方式实现C ++ 11规范。以下代码可在我测试过的编译器中使用,而许多注释者使用其他编译器。
引用Shafik Yaghmour的回答:在编译时计算C字符串的长度。这真的是constexpr吗?
不能保证在编译时就对常量表达式进行求值,但是从C ++标准草案第5.19节常量表达式中我们只能得到一个非规范性的引用,尽管如此:
[...]> [注意:常量表达式可以在翻译过程中求值。
这个词can改变了世界。
因此,YMMV对此问题(或任何问题)的涉及constexpr,取决于编译器作者对规范的解释。
[2016.01.31更新]
由于有些人不喜欢我之前的答案,因为它不需要字符串比较就可以实现目标,从而避免了compile time string compareOP 的整个方面,因此这里提供了更详细的答案。
你不能!不在C98或C99中。甚至在C11中也没有。大量的MACRO操作都不会改变这一点。
中const-expression使用的定义#if不允许使用字符串。
它确实允许使用字符,因此,如果您限制使用字符,则可以使用以下命令:
#define JACK 'J'
#define QUEEN 'Q'
#define CHOICE JACK // or QUEEN, your choice
#if 'J' == CHOICE
#define USER "jack"
#define USER_VS "queen"
#elif 'Q' == CHOICE
#define USER "queen"
#define USER_VS "jack"
#else
#define USER "anonymous1"
#define USER_VS "anonymous2"
#endif
#pragma message "USER IS " USER
#pragma message "USER_VS IS " USER_VS
您可以!在C ++ 11中。如果定义一个编译时辅助函数进行比较。
// compares two strings in compile time constant fashion
constexpr int c_strcmp( char const* lhs, char const* rhs )
{
return (('\0' == lhs[0]) && ('\0' == rhs[0])) ? 0
: (lhs[0] != rhs[0]) ? (lhs[0] - rhs[0])
: c_strcmp( lhs+1, rhs+1 );
}
// some compilers may require ((int)lhs[0] - (int)rhs[0])
#define JACK "jack"
#define QUEEN "queen"
#define USER JACK // or QUEEN, your choice
#if 0 == c_strcmp( USER, JACK )
#define USER_VS QUEEN
#elif 0 == c_strcmp( USER, QUEEN )
#define USER_VS JACK
#else
#define USER_VS "unknown"
#endif
#pragma message "USER IS " USER
#pragma message "USER_VS IS " USER_VS
因此,最终,您将不得不改变实现为USER和选择最终字符串值的目标的方式USER_VS。
您不能在C99中进行编译时间字符串比较,但是可以进行字符串的编译时间选择。
如果确实必须进行编译时比较,则需要更改为允许该功能的C ++ 11或更高版本。
[原始答案]
尝试:
#define jack_VS queen
#define queen_VS jack
#define USER jack // jack or queen, your choice
#define USER_VS USER##_VS // jack_VS or queen_VS
// stringify usage: S(USER) or S(USER_VS) when you need the string form.
#define S(U) S_(U)
#define S_(U) #U
更新:ANSI令牌粘贴有时不太明显。;-D
#在宏之前放置单个会导致将其更改为其值的字符串,而不是其裸值。
##在两个标记之间放置一个双精度值会使它们被串联为一个标记。
因此,宏USER_VS的扩展名为jack_VS或queen_VS,具体取决于您的设置方式USER。
该字符串化宏S(...)使用宏间接这样命名宏的值被转换成字符串。而不是宏的名称。
因此,USER##_VS成为jack_VS(或queen_VS),这取决于你如何设置USER。
稍后,当将stringify宏用作(在此示例中)S(USER_VS)的值时,将传递到间接步骤,该步骤会将其value()转换为string 。USER_VSjack_VSS_(jack_VS)queen"queen"
如果设置USER为,queen则最终结果是字符串"jack"。
有关令牌串联的信息,请参见:https : //gcc.gnu.org/onlinedocs/cpp/Concatenation.html
有关令牌字符串的转换,请参见:https : //gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification
c语言中字符串比较指令,如何在C条件预处理器指令中比较字符串相关推荐
- C 语言编程 — 宏定义与预处理器指令
目录 文章目录 目录 前文列表 宏 预处理器 预处理器指令 预处理器指令示例 预处理器指令运算符 宏定义 简单宏定义 带参数的宏定义 符号吞噬问题 使用 do{}while(0) 结构 预定义的宏 常 ...
- c语言预处理器指令的简单例子
预处理器指令一般是如下三种: (1)宏定义 (2)条件编译 :比如#if,#else,#ifdef,#ifndef,#elif,#endif (3) 文件包含 #include <stdio.h ...
- 在c语言中预处理命令行都以井号开头,以井号开头的行和gcc预处理器输出中的'#1“ac”'之类的数字是什么意思?...
以井号开头的行和gcc预处理器输出中的'#1"ac"'之类的数字是什么意思? 我使用打印出C预处理器的输出 gcc -E a.c 输出包含许多行 # 1 "a.c&quo ...
- 《C#零基础入门之百识百例》(九十一)预处理器指令 -- 代码示例
C#零基础入门 预处理器指令 -- 代码示例 前言 一,预处理器指令 1.1 概念 1.2 常用预处理指令 1.3 语法规则 二,声明指令 2.1 声明指令概念 2.2 代码示例 三,条件编译指令 3 ...
- C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif
预处理器命令的功能非常强大,在编程过程中的使用也非常广泛,比如在版本发布中使用非常方便: 1,#define(告诉编译器存在给定名称的符号) #undefine(删除符号) 2,#if # ...
- python做的数据图表怎么在flask中显示_Python:如何在Flask应用程序的表中显示MySQL查询的数据...
我对Python/flask还比较陌生,有些数据库方面的东西也有问题. 我能够在不同的函数中连接到MySQL数据库,并从使用wtforms插入数据库的用户那里获得表单输入.现在我想使用jinja模板以 ...
- java 中 webcam类_如何在Java的Swing应用程序中集成Webcam?
>下载并安装 JMF >将jmf.jar添加到项目库中 >下载 FrameGrabber源文件并将其添加到项目中 >按如下方式使用它开始捕获视频. 新的FrameGrabber ...
- C#预处理器指令 用法
第一种: 在Visual Studio 开发环境中设置此编译器选项. 1,打开项目的"属性"页. 2,单击"生成"属性页. 如下图 上图的几点说明: 1,如果在 ...
- Java数组传参sql_Java中如何传一个数组作为筛选条件操作数据库(sql中foreach的使用)...
实现步骤: 1. 把前端获取到的要删除的数据的nId,以逗号作为分隔符,组成一个da(其中checkStatus.data.length和checkStatus.data[i].nId是layui里面 ...
最新文章
- +++++++X86平台系统启动流程
- 【转】C++面试题(四)——智能指针的原理和实现
- Py之textrank4zh:textrank4zh的简介、安装、使用方法之详细攻略
- 我的android studio
- HTTP中GET与POST方法有什么区别
- 《who Who Are You Working For》(你在为谁工作)
- 音视频开发(10)---nginx-rtmp视频流服务器搭建
- c++之static的一些用法
- IDEA快捷键之搜索查询
- 远程服务器虚拟显示器配置方法
- 财智家庭理财软件 V5.5 精锐版
- xp系统怎么关闭wmi服务器,WinXP系统如何启用WMI服务,小编教你WinXP系统如何启用WMI服务...
- Flutter Dio 报错is not a subtype of type ‘DioError‘
- 电影下载合并教程 (转)
- cocos2dx 自定义事件
- 十五分钟快速入门系列:Python基础
- 实名推荐的神器,你安排上了几款?
- java语言for模板_Java中使用FreeMaker实现模板渲染
- java方向的光脚丫子的电影,斯嘉丽·约翰逊:“光着脚丫子”示人,这足踝,这足弓,爱了好吗...
- 关于自动更换xp桌面的壁纸。
热门文章
- 什么是repo文件?
- 推荐五款很实用却比较冷门的电脑软件
- HDU 2838 Cow Sorting(双树状数组+求逆序数)
- java 打印表格文件
- JuiceFS 在大搜车数据平台的实践
- python光棍节快乐_2020年光棍节快乐的祝福语10句
- 猎杀对决与服务器连接中断,猎杀对决游戏常见问题汇总_猎杀对决游戏常见问题解决办法...
- 2017美团点评校招前端面试题
- 用正则表达式求非负整数 、匹配正整数、非正整数、负整数、整数、非负浮点数、正浮点数、非正浮点数、负浮点数、浮点数、有数字26个英文字母组成的字符串
- linux网口初始化_深入理解Linux网络技术内幕——网络设备初始化