热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

是否可以使用有条件选择的字符串文字初始化字符数组?

如何解决《是否可以使用有条件选择的字符串文字初始化字符数组?》经验,为你挑选了1个好方法。

我知道char用字符串文字初始化数组是完全可能的:

char arr[] = "foo";

C++ 11 8.5.2/1这样说:

char阵列(是否平原char,signed charunsigned char),char16_t阵列,char32_t阵列或 wchar_t阵列可通过一个窄字符文字,初始化char16_t字符串文字,char32_t字符串文字或宽字符串文字,分别或通过适当类型的字符串文字括在括号内.字符串文字值的连续字符初始化数组的元素....

但是,你可以在条件表达式中使用两个字符串文字吗?例如这样:

char arr[] = MY_BOOLEAN_MACRO() ? "foo" : "bar";

(MY_BOOLEAN_MACRO()扩展为a 10).

C++ 11 5.16(条件运算符)的相关部分如下:

1 ...第一个表达式在上下文中转换为bool(第4条).它被评估,如果是true,则条件表达式的结果是第二个表达式的值,否则是第三个表达式的值....

4如果第二个和第三个操作数是相同值类别的glvalues并且具有相同的类型,则结果属于该类型和值类别,如果第二个或第三个操作数是位字段,则它是位字段,或者如果两者都是位字段.

请注意,文字的长度相同,因此它们都是类型的左值const char[4].

GCC one ideone接受该构造.但是从阅读标准来看,我根本不确定它是否合法.有没有人有更好的洞察力?



1> Shafik Yaghm..:

另一方面clang,不接受这样的代码(看到它直播),我相信这clang是正确的(MSVC也拒绝这个代码).

文字串是通过在段语法定义2.14.5:

string-literal:
    encoding-prefixopt" s-char-sequenceopt"
    encoding-prefixoptR raw-string

本节的第一段说(强调我的):

字符串文字由双引号括起的字符序列(如2.14.3中所定义) ,可选地以R,u8,u8R,u,uR,U,UR,L或LR为前缀,如"......"中所示. ,R"(...)",u8"......",u8R" (...) ",u"...",uR" 〜(...)〜",U"......" ,UR"zzz(...)zzz",L"......"或LR"(...)"

并进一步说明了一个狭窄的字符串文字的类型是:

"n const char数组",

以及:

有静态存储时间

但是一个"n const char数组",静态存储持续时间不是字符串文字,因为它不符合语法,也不适合段落1.

gcc如果我们使用非常量表达式,我们可以使它失败(请参见实时):

bool x = true ;
char arr[] = x ? "foo" : "bar";

这意味着它可能是一个扩展,但它不符合要求,因为它不会在严格的一致性模式下产生警告,即使用-std=c++11 -pedantic.来自1.4 [intro.compliance]部分:

[...]根据本国际标准,需要实施来诊断使用此类扩展的程序.但是,这样做之后,他们就可以编译和执行这样的程序.


同意,8.5.2/1似乎很清楚,它是*string literal*而不是*某个表达式,它计算为字符串文字*.(即使您将三元运算符视为在此情况下对字符串文字进行求值).
推荐阅读
  • linux 字符串数组初始化,C++字符数组初始化方法的分析
    发现了一个字符数组初始化的误区,而这个往往能导致比较严重的性能问题,分析介绍如下:往往我们在初始化一个字符数组,大概有如下几 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了题解P1286两数之和相关的知识,希望对你有一定的参考价值。提供一个新思路这题,我们假设n个数分别为a1 ... [详细]
  • AtonepointIhadlookedatimplementingaclasstemplateinC++thatwouldsupportanEnumthatwo ... [详细]
author-avatar
手机用户2602911885
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有