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条件预处理器指令中比较字符串相关推荐

  1. C 语言编程 — 宏定义与预处理器指令

    目录 文章目录 目录 前文列表 宏 预处理器 预处理器指令 预处理器指令示例 预处理器指令运算符 宏定义 简单宏定义 带参数的宏定义 符号吞噬问题 使用 do{}while(0) 结构 预定义的宏 常 ...

  2. c语言预处理器指令的简单例子

    预处理器指令一般是如下三种: (1)宏定义 (2)条件编译 :比如#if,#else,#ifdef,#ifndef,#elif,#endif (3) 文件包含 #include <stdio.h ...

  3. 在c语言中预处理命令行都以井号开头,以井号开头的行和gcc预处理器输出中的'#1“ac”'之类的数字是什么意思?...

    以井号开头的行和gcc预处理器输出中的'#1"ac"'之类的数字是什么意思? 我使用打印出C预处理器的输出 gcc -E a.c 输出包含许多行 # 1 "a.c&quo ...

  4. 《C#零基础入门之百识百例》(九十一)预处理器指令 -- 代码示例

    C#零基础入门 预处理器指令 -- 代码示例 前言 一,预处理器指令 1.1 概念 1.2 常用预处理指令 1.3 语法规则 二,声明指令 2.1 声明指令概念 2.2 代码示例 三,条件编译指令 3 ...

  5. C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif

    预处理器命令的功能非常强大,在编程过程中的使用也非常广泛,比如在版本发布中使用非常方便: 1,#define(告诉编译器存在给定名称的符号)    #undefine(删除符号) 2,#if    # ...

  6. python做的数据图表怎么在flask中显示_Python:如何在Flask应用程序的表中显示MySQL查询的数据...

    我对Python/flask还比较陌生,有些数据库方面的东西也有问题. 我能够在不同的函数中连接到MySQL数据库,并从使用wtforms插入数据库的用户那里获得表单输入.现在我想使用jinja模板以 ...

  7. java 中 webcam类_如何在Java的Swing应用程序中集成Webcam?

    >下载并安装 JMF >将jmf.jar添加到项目库中 >下载 FrameGrabber源文件并将其添加到项目中 >按如下方式使用它开始捕获视频. 新的FrameGrabber ...

  8. C#预处理器指令 用法

    第一种: 在Visual Studio 开发环境中设置此编译器选项. 1,打开项目的"属性"页. 2,单击"生成"属性页. 如下图 上图的几点说明: 1,如果在 ...

  9. Java数组传参sql_Java中如何传一个数组作为筛选条件操作数据库(sql中foreach的使用)...

    实现步骤: 1. 把前端获取到的要删除的数据的nId,以逗号作为分隔符,组成一个da(其中checkStatus.data.length和checkStatus.data[i].nId是layui里面 ...

最新文章

  1. +++++++X86平台系统启动流程
  2. 【转】C++面试题(四)——智能指针的原理和实现
  3. Py之textrank4zh:textrank4zh的简介、安装、使用方法之详细攻略
  4. 我的android studio
  5. HTTP中GET与POST方法有什么区别
  6. 《who Who Are You Working For》(你在为谁工作)
  7. 音视频开发(10)---nginx-rtmp视频流服务器搭建
  8. c++之static的一些用法
  9. IDEA快捷键之搜索查询
  10. 远程服务器虚拟显示器配置方法
  11. 财智家庭理财软件 V5.5 精锐版
  12. xp系统怎么关闭wmi服务器,WinXP系统如何启用WMI服务,小编教你WinXP系统如何启用WMI服务...
  13. Flutter Dio 报错is not a subtype of type ‘DioError‘
  14. 电影下载合并教程 (转)
  15. cocos2dx 自定义事件
  16. 十五分钟快速入门系列:Python基础
  17. 实名推荐的神器,你安排上了几款?
  18. java语言for模板_Java中使用FreeMaker实现模板渲染
  19. java方向的光脚丫子的电影,斯嘉丽·约翰逊:“光着脚丫子”示人,这足踝,这足弓,爱了好吗...
  20. 关于自动更换xp桌面的壁纸。

热门文章

  1. 什么是repo文件?
  2. 推荐五款很实用却比较冷门的电脑软件
  3. HDU 2838 Cow Sorting(双树状数组+求逆序数)
  4. java 打印表格文件
  5. JuiceFS 在大搜车数据平台的实践
  6. python光棍节快乐_2020年光棍节快乐的祝福语10句
  7. 猎杀对决与服务器连接中断,猎杀对决游戏常见问题汇总_猎杀对决游戏常见问题解决办法...
  8. 2017美团点评校招前端面试题
  9. 用正则表达式求非负整数 、匹配正整数、非正整数、负整数、整数、非负浮点数、正浮点数、非正浮点数、负浮点数、浮点数、有数字26个英文字母组成的字符串
  10. linux网口初始化_深入理解Linux网络技术内幕——网络设备初始化