Tag: 标准

这是合法的C / C ++吗? `int * p =(int ){1,2,3};`

我的这个答案产生了一些评论声称以下构造不是合法的C / C ++: void f (int* a) ; f ((int[]){1,2,3,4,0}) ; (请参阅此完整程序的ideone链接 )。 但我们无法解决问题。 任何人都可以对此有所了解吗? 各种标准有什么用?

在C中是否有任何保证代码在未定义的行为之前?

在下面的代码中保证打印“0 \ n”? #include int main(void) { int c = 0; printf(“%d\n”,c); printf(“%d,%d\n”,++c,++c); } 更一般地说,如果一个程序有未定义的行为,整个程序是不确定的,还是仅从开始出现问题代码的序列点开始? 请注意:我不是在询问编译器对第二个printf的作用。 我问的是第一个printf是否有保证会发生。 我知道未定义的行为能够炸毁你的计算机,崩溃你的程序或其他什么。

我可以写一个非const结构的const成员吗?

这段代码合法吗?: #include typedef struct a_d{ int const x; } a_d; int a_d__ctor(a_d *X) { *(int*)&X->x = 42; //<– legal or not? return 0; } int main() { a_d a; a_d__ctor(&a); printf("ax=%d\n", ax); }

_Bool的printf转换说明符?

使用printf() ,我可以将%hhu用于unsigned char ,将%hi用于short int ,将%zu用于size_t ,将%tx用于ptrdiff_t等。 我对_Bool使用什么转换格式说明符? 标准中是否存在一个? 或者我必须像这样投射: _Bool foo = 1; printf(“foo: %i\n”, (int)foo);

超出翻译限制是不确定的行为,是否有检查工具来找到它?

原始问题: 我正在搜索C90标准,以便在编写高可移植代码时注意事项,同时对编译器供应商的良好意愿缺乏信任,并假设我的软件有时可能会杀死某人,如果我做错了。 让我们说我有点偏执。 目前我在考虑“翻译限制”(5.2.4.1 ANSI / ISO 9899:1990)。 正如标准中所指出的那样:“ ansi C是否限制了程序中外部变量的数量? ”,这些是标准符合实现的最低要求。 现在另一方面,这意味着,任何实现都不需要做更多 – 如果我想确保我的代码适用于任何confrom实现,这些限制代表我的绝对限制。 到目前为止很烦人。 因此编译器供应商选择的限制等于或高于最低要求的转换限制。 如果超出特定实施的实施定义的转换限制,现在会发生什么? 在我的ANSI / IO 9899:1990(C90)副本中,我没有找到任何东西,所以我认为它是“3种类型的未定义行为”(通过省略)。 另一方面,这不是第一次,我误解了标准或没有找到合适的通道。 所以这是我的问题: IS是否超过C90中特定实现未定义行为的转换限制? C90行为是否适用于C95 / C96以及新迭代C99和C11的修正版本? 有没有人看过那里的检查工具,检查最小的或(工具)用户定义的限制? 超出原始问题的方面: 答案和评论中有趣的方面: 1)正如迈克尔·伯尔在对该问题的直接评论中指出的那样,根据C标准(我只检查了没有更正的C90,以及C99草案,Michael 在这里引用),符合C的实现只需要接受一个程序,它同时包含所有限制,在最严格的解释中取消任何最小限制保证。 2)正如rubenvb和Keith Thompson指出的那样,某些质量的实现应该为案例提供诊断,超出它们的实现定义限制,特别是如果不符合最低要求(rubenvb在评论中链接了MSVC的示例) 。 3)由于超出编译器限制可能是未定义的行为,但肯定会导致某些错误,转换限制适用于我的某段代码的“变量”的值代表重用的前提条件。 我个人的策略来处理它们 1)因此,对于最大的偏执狂,我会愚弄自己,并惹恼编译器供应商的支持,请求保证我,实现选择的限制适用于任何程序。 🙁 2)因此,我将研究编译器文档以及编译器支持获得确认的痛苦程度: – 对于每个转换限制,如果超出,将引发诊断,并且 – 因为它是未定义的行为,如果每个超出翻译限制的实例都会引发诊断 – 或者另一个错误已经阻止了编译。 3)因此,我将尝试开发一个工具(或者如果我真的必须开发自己),测量这些值,并将它们作为我的程序的代码重用的前提条件。 正如Keith Thompson在本回答中指出的那样,一些价值观可能需要更深入地了解实施如何实施。 我不能完全确定在这种情况下除了2)中的行为之外还能提供什么帮助。但是,据我所知,我必须进行测试 – 但我只需要测试是否有UB(没有诊断),如果这是在这种情况下,成功的测试不能保证一般情况下的正确性。 回答说: 是的,它是未定义的行为。 […]

C和C ++预处理器之间有什么区别?

C和C ++预处理器之间的行为有什么不同吗? 它们由标准文本的不同段落定义( C标准的第6.10节和C ++标准的第16节)。 我提出这个问题的动机是, 将单引号作为最近被C ++ 14接受的数字分隔符的提议扩展了C ++预处理程序语法以适应这种变化(具体来说,它扩展了pp数的定义),以及我想知道这是否会引入C和C ++预处理器之间的不兼容性,如果是这样,它是否是第一个这样做的function。

&C中数组的运算符定义

最近的一个问题促成了以数组和指针为中心的讨论。 问题是参考scanf(“%s”, &name) vs scanf(“%s”, name) 。 对于以下代码,Microsoft实际上在VS2010(也许是早期版本?)中为您解决了这个问题, #include int main() { char name[30]; printf(“Scan \”name\” – “); scanf(“%s”, name); printf(“Print \”&name\” – %s\n”, &name); printf(“Print \”name\” – %s\n”, name); printf(“Pointer to &name – %p\n”, &name); printf(“Pointer to name – %p\n”, name); printf(“\n\n”); printf(“Scan \”&name\” – “); scanf(“%s”, &name); printf(“Print \”&name\” – %s\n”, &name); printf(“Print […]

C / C ++编译器能否通过pthread库调用合法地在寄存器中缓存变量?

假设我们有以下代码: #include #include #include void guarantee(bool cond, const char *msg) { if (!cond) { fprintf(stderr, “%s”, msg); exit(1); } } bool do_shutdown = false; // Not volatile! pthread_cond_t shutdown_cond = PTHREAD_COND_INITIALIZER; pthread_mutex_t shutdown_cond_mutex = PTHREAD_MUTEX_INITIALIZER; /* Called in Thread 1. Intended behavior is to block until trigger_shutdown() is called. */ void wait_for_shutdown_signal() { int res; […]

HTML版C标准草案(n1256.pdf)?

是否有HTML版本的n1256.pdf(ISO C99 + TC3),或推荐的方式将其转换为html或另一种不那么痛苦的浏览格式? 我尝试过的所有pdf转换器都给出了非常糟糕的结果,特别是在未能将“fi”连字转换为更容易搜索的内容时,而且仅仅是基本格式化。 以下是原始参考: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

ANSI C和ISO C之间有什么区别吗?

我知道C有ANSI标准和ISO标准。这两个标准之间有什么区别吗? 如果是这样,他们是什么? 如果没有差异那么有两个标准是什么意思?