Questions tagged «standards»

标准已正式发布或在格式,程序或协议上达成了一致。它们允许个人或组织通过设置基本规则或界限进行协作。标准通常带有一组前提条件或假设,使合作者可以将这些条件或假设作为基础事实。


6
从Shell脚本启动Web浏览器的干净方法?
在bash脚本中,我需要启动用户Web浏览器。似乎有很多方法可以做到这一点: $BROWSER xdg-open gnome-open 在GNOME上 www-browser x-www-browser ... 有没有一种比其他方法更标准的方法可以在大多数平台上使用,或者我是否应该使用类似这样的方法: #/usr/bin/env bash if [ -n $BROWSER ]; then $BROWSER 'http://wwww.google.com' elif which xdg-open > /dev/null; then xdg-open 'http://wwww.google.com' elif which gnome-open > /dev/null; then gnome-open 'http://wwww.google.com' # elif bla bla bla... else echo "Could not detect the web browser to use." …

4
是无符号整数减法定义的行为吗?
我遇到了某人的代码,该人似乎认为当结果为负数时,从另一个相同类型的整数中减去无符号整数是有问题的。这样的代码即使在大多数架构上都能正常工作,也是不正确的。 unsigned int To, Tf; To = getcounter(); while (1) { Tf = getcounter(); if ((Tf-To) >= TIME_LIMIT) { break; } } 这是我能从C标准中找到的唯一含糊的相关报价。 涉及无符号操作数的计算永远不能溢出,因为无法用所得的无符号整数类型表示的结果的模数要比该所得的类型可以表示的最大值大一模。 我想可以用这个引号来表示,当右操作数较大时,该操作将被调整为在取模截数的上下文中有意义。 即 为0x0000 - 0x0001的== 0X 1 0000 - 0x0001的== 0xFFFF的 与使用依赖于实现的签名语义相反: 0x0000-0x0001 ==(无符号)(0 + -1)==(0xFFFF也是0xFFFE或0x8001) 哪种解释正确?完全定义了吗?

12
检查空数组:计数与空
这个关于“ 如何判断PHP数组是否为空 ”的问题让我想到了这个问题 确定数组是否为空时,count是否应该使用代替理由empty? 我个人认为如果在使用空数组的情况下2是否相等,empty因为它为布尔问题提供了布尔答案。从上面链接的问题来看,这似乎count($var) == 0是流行的方法。对我来说,尽管在技术上是正确的,但没有任何意义。例如:$ var,您是空的吗?答:7。嗯... 是我应该count == 0改用还是仅出于个人喜好? 正如其他人在注释中指出的那样,现在删除的答案count将对大型数组产生性能影响,因为它将必须计算所有元素,而empty一旦知道它不为空就可以停止。因此,如果在这种情况下它们给出相同的结果,但count效率可能很低,那么为什么还要使用count($var) == 0?


6
在编译时计算C字符串的长度。这真的是constexpr吗?
我正在尝试在编译时计算字符串文字的长度。为此,我使用以下代码: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } 一切正常,程序输出4和8。clang生成的汇编代码表明结果是在编译时计算的: 0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d" 0x100000f65: movl $0x4, %esi 0x100000f6a: movl $0x8, %edx 0x100000f6f: xorl %eax, %eax 0x100000f71: callq …

3
是否有机器,其中sizeof(char)!= 1,或者至少CHAR_BIT> 8?
Наэтотвопросестьответына 堆栈溢出нарусском:Кто-нибудьвстречалвсвоейпрактике的sizeof(焦炭)= 1!? 是否有机器(或编译器)在哪里sizeof(char) != 1? C99标准是否说sizeof(char)在标准合规性实施上必须完全为1?如果有,请给我编号和引用。 更新: 如果我有一台不能寻址字节的机器(CPU)(最小读取为4字节,对齐),但是只有4-s字节(uint32_t),则该机器的编译器可以定义sizeof(char)为4吗? sizeof(char)将为1,但char将具有32位(CHAR_BIT宏) Update2: 但是sizeof结果不是BYTES!它是CHAR的大小。char可以是2个字节,或者(可能是)7位? 更新3: 好的。所有机器都有sizeof(char) == 1。但是什么机器CHAR_BIT > 8呢?
93 c  char  standards  sizeof  c99 

9
HTML标签上的非标准属性。好东西吗 坏事?你的想法?
当涉及到标签上的非标准属性时,HTML(也许只是XHTML?)相对严格。如果它们不是规范的一部分,那么您的代码将被视为不符合规范。 但是,非标准属性对于将元数据传递到Javascript可能非常有用。例如,如果假设链接显示弹出窗口,则可以在属性中设置弹出窗口的名称: <a href="#null" class="popup" title="See the Popup!" popup_title="Title for My Popup">click me</a> 或者,您可以将弹出窗口的标题存储在一个隐藏元素中,例如跨度: <style> .popup .title { display: none; } </style> <a href="#null" title="See the Popup!" class="popup"> click me <span class="title">Title for My Popup</span> </a> 但是,我对于应该使用哪种方法感到不满意。第一种方法更简洁,我猜想,它不会像搜索引擎和屏幕阅读器那样费劲。相反,第二种选择使存储大量数据更加容易,因此用途更广。它也符合标准。 我很好奇这些社区的想法。您如何处理这种情况?第一种方法的简单性是否超过潜在的缺点(如果有)?


3
不赞成使用static关键字…不再吗?
在C ++中,可以static在翻译单元中使用关键字来影响符号(变量或函数声明)的可见性。 在n3092中,已弃用: 附件D.2 [depr.static] 在命名空间范围内声明对象时,不建议使用static关键字(请参阅3.3.6)。 在n3225中,已将其删除。 在我能找到的唯一的文章是有点非正式的。 它确实强调了,为了与C兼容(以及将C程序编译为C ++的能力),弃用是令人讨厌的。但是,直接将C程序编译为C ++可能会令人沮丧,因此我不确定是否值得考虑。 有谁知道为什么要更改?
89 c++  static  c++11  standards 

4
“易失性”的定义是易失性的,还是GCC存在一些标准合规性问题?
我需要一个函数(例如WinAPI中的SecureZeroMemory)始终将内存归零,并且不会被优化,即使编译器认为此后再也不会访问内存了。似乎是挥发物的理想选择。但是我在将其与GCC一起使用时遇到了一些问题。这是一个示例函数: void volatileZeroMemory(volatile void* ptr, unsigned long long size) { volatile unsigned char* bytePtr = (volatile unsigned char*)ptr; while (size--) { *bytePtr++ = 0; } } 很简单。但是,如果您调用GCC实际生成的代码,则随着编译器版本以及您实际上试图将其设置为零的字节数而大不相同。https://godbolt.org/g/cMaQm2 GCC 4.4.7和4.5.3永远不会忽略挥发物。 对于数组大小1、2和4,GCC 4.6.4和4.7.3忽略了volatile。 GCC 4.8.1至4.9.2会忽略数组大小1和2的volatile。 GCC 5.1直到5.3会忽略数组大小1、2、4、8的volatile 对于任何数组大小(一致性的加分点),GCC 6.1都将忽略它。 我测试过的任何其他编译器(clang,icc,vc)都可以生成期望的存储,并且具有任何编译器版本和任何数组大小。所以在这一点上,我想知道,这是一个(相当老而严重的)GCC编译器错误,还是该标准中的volatile定义不精确地表明这实际上是符合规范的行为,因此根本不可能编写可移植的“ SecureZeroMemory”功能? 编辑:一些有趣的观察。 #include <cstddef> #include <cstdint> #include <cstring> #include <atomic> void callMeMaybe(char* …
89 c++  c  gcc  standards 



8
标准使用“ Z”而不是NULL来表示丢失的数据?
除了是否应使用NULL之外,我还负责一个现有数据库,该数据库使用NULL表示“丢失或从未输入”数据。它不同于空字符串,它表示“用户设置了该值,并且他们选择了'空'”。 该项目的另一个承包商坚决主张“对于我来说不存在NULL;我从不使用NULL,并且任何人都不应使用NULL”。但是,令我困惑的是,由于承包商的团队确实承认“缺少/从未输入”和“故意空着或由用户指示为未知”之间的区别,因此他们在整个代码和存储过程中使用单个字符“ Z”表示“缺少/从未输入”,在整个数据库的其余部分中的含义与NULL相同。 尽管我们共享的客户要求更改此设置,而我也支持此要求,但是该团队将其称为比我更先进的DBA中的“标准做法”。他们不愿意仅根据我的无知请求更改为使用NULL。那么,有人可以帮助我克服我的无知吗?在SQL专家中,是否有任何标准或一小群人,甚至是一个大声的提倡使用“ Z”代替NULL的人? 更新资料 我有承包商的回应要补充。当客户要求删除特殊值以允许无数据列中的NULL时,他说的是这句话: 基本上,我设计数据库时要尽可能避免NULL。这是基本原理: •不需要在字符串[VARCHAR]字段中使用NULL,因为空(零长度)字符串会提供完全相同的信息。 • 整数字段(例如,ID值)中的NULL可以通过使用数据中永远不会出现的值(例如,整数IDENTITY字段为-1)来处理。 • 日期字段中的NULL会很容易导致日期计算复杂化。例如,在计算日期差异(例如[RecoveryDate]和[OnsetDate]之间的天数差异)的逻辑中,如果一个或两个日期为NULL,则逻辑将爆炸-除非为两个日期都明确允许为NULL。那是额外的工作和额外的处理。如果[RecoveryDate]和[OnsetDate]使用“默认”或“占位符”日期(例如“ 1/1/1900”),则数学计算可能会显示“异常”值-但日期逻辑不会爆炸。 传统上,NULL处理是开发人员在存储过程中犯错的领域。 在我作为DBA的15年中,我发现最好尽可能避免使用NULL。 这似乎证实了对该问题的大部分消极反应。不是使用公认的6NF方法来设计NULL,而是使用特殊值来“尽可能避免NULL”。我以开放的态度发表了这个问题,很高兴我了解到更多有关“空值有用/空值很邪恶”的辩论,但是现在我很乐意将“特殊值”方法标记为完全废话。 空(零长度)字符串将提供完全相同的信息。 不,不是。在我们正在修改的现有数据库中,NULL表示“从未输入”,空字符串表示“输入为空”。 传统上,NULL处理是开发人员在存储过程中犯错的领域。 是的,但是成千上万的开发人员已经犯下了数千次错误,而且避免这些错误的教训和警告也广为人知并记录在案。如此处所述:无论您接受还是拒绝NULL,缺失值的表示都是一个已解决的问题。无需仅仅因为开发人员不断犯下易于克服(且易于识别)的错误而发明新的解决方案。 作为一个脚注:我已经成为DBE和开发人员已有20多年了(对于我来说,足够时间了解数据库工程师和数据库管理员之间的区别)。在我的整个职业生涯中,我一直都处于“ NULL是有用的”阵营,尽管我知道几个非常聪明的人不同意。我对“特殊价值”方法非常怀疑,但是对“如何避免以正确方式避免NULL”的学术知识不够扎实。我一直喜欢学习新事物,而且20年后我仍然有很多东西要学习。感谢所有为此做出有益讨论的人。

13
通过下标获取一个最后一个数组元素的地址:是否符合C ++标准?
我已经看到它多次断言C ++标准不允许以下代码: int array[5]; int *array_begin = &array[0]; int *array_end = &array[5]; 是&array[5]合法的C ++代码,在这种情况下? 如果可能的话,我想参考标准的答案。 知道它是否符合C标准也很有趣。如果不是标准的C ++,为什么要决定将其与array + 5or区别对待&array[4] + 1?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.