Tag: c99

智能指针/ C安全内存pipe理?

我和其他许多人使用智能指针在C ++中使用诸如RAII等这样的东西来包装不安全的内存操作,取得了巨大的成功。 但是,如果有析构函数,类,操作符重载等,则包装内存pipe理更容易实现。 对于使用原始C99编写的程序,您可以在哪里指出(无意双关)来帮助安全的内存pipe理? 谢谢。

printf long long int in C with GCC?

我如何使用GCC在C99中使用printf long long int和unsigned long long int ? 我已经search了其他build议使用%lldpost,但是它给出了这些警告: 警告#1:格式为[-Wformat] |的未知转换types字符'l' 警告#2:格式参数太多[-Wformat-extra-args] | 对于以下尝试: #include <stdio.h> int main() { long long int x = 0; unsigned long long int y = 0; printf("%lld\n", x); printf("%llu\n", y); }

结构中的匿名联合不在c99中?

这里是非常简化的问题我有: enum node_type { t_int,t_double }; struct int_node { int值; }; struct double_node { 双重价值; }; struct node { 枚举node_typetypes; 联合{ struct int_node int_n; struct double_node double_n; }; }; int main(void){ struct int_node i; i.value = 10; struct node n; n.type = t_int; ñ。 int_n = i; 返回0; } 我不明白的是: $ cc us.c $ cc […]

intXX_t和int_fastXX_t有什么区别?

我最近发现了标准最快types的存在,主要是int_fast32_t和int_fast64_t 。 我总是被告知,为了在主stream架构上正常使用,最好使用经典的int & long ,它应该总是适合处理器默认的读取能力,这样可以避免无用的数值转换。 在C99标准中,它在§7.18.1.3p2中说: “typedef名称int_fastN_t指定宽度至less为N的最快有符号整数types。typedef名称uint_fastN_t指定宽度至less为N的最快无符号整数types。 而且在§7.18.1.3p1中也有关于它的引用: “对于所有目的,指定types不保证是最快的;如果实现没有明确的select一种types的理由,它只会select一些符合签名和宽度要求的整数types。 我不清楚什么最快的真正意义。 我不明白什么时候应该使用这种types,什么时候不应该使用。 我在这个上搜了一下,发现一些开源 项目已经把它们的一些function改变了,但并不是全部。 他们并没有真正解释为什么他们改变了一部分代码,而只是代码的一部分。 你知道什么是int_fastXX_t 真的比经典的更快吗?

什么是正确使用printf来显示用0填充的指针

在C中,我想使用printf来显示指针,并使它们正确排列,我想用0填充它们。 我的猜测是,正确的做法是: printf(“%016p”,ptr); 这工作,但这个海湾合作委员会抱怨以下消息: 警告:与'%p'gnu_printf格式一起使用'0'标志 我已经google了一下,下面的线程是在同一个主题,但并没有真正给出解决scheme。 http://gcc.gnu.org/ml/gcc-bugs/2003-05/msg00484.html 阅读它,似乎gcc抱怨的原因是我提出的语法没有在C99中定义。 但我似乎无法find任何其他方式以标准认可的方式来做同样的事情。 所以这里是双重的问题: 我的理解是正确的,这种行为不是由C99标准定义的? 如果是这样,是否有一个标准的批准,便携式的方式呢?

在Linux中奇怪的使用条件运算符

在3.0.4 Linux内核中,mm / filemap.c具有以下代码行: retval = retval ?: desc.error; 我已经试过用gcc -Wall编译一个类似的最小testing用例,不要收到任何警告; 行为似乎相同: retval = retval ? retval : desc.error; 看看C99标准,我无法弄清楚这个行为的正式描述。 为什么这是好的?

为什么在C99之前混合了声明和代码?

我最近成为一个主要教授C的大学课程的助教。C90课程标准化,主要是由于广泛的编译器支持。 对于以前的Java经验的C新手来说,一个非常混乱的概念是variables声明和代码不能混在一个块(复合语句)中的规则。 C99终于解除了这个限制,但我想知道:有人知道为什么它在那里吗? 它是否简化了variables范围分析? 它是否允许程序员指定在哪些程序执行点上堆栈应该为新variables增长? 我认为语言devise者如果完全没有任何目的,就不会增加这样的限制。

如何正确添加hex转义string文字?

当你在C中有string时,你可以在里面添加直接的hex代码。 char str[] = "abcde"; // 'a', 'b', 'c', 'd', 'e', 0x00 char str2[] = "abc\x12\x34"; // 'a', 'b', 'c', 0x12, 0x34, 0x00 这两个例子在内存中都有6个字节。 现在,如果要在hexinput后添加值[a-fA-F0-9] ,则存在问题。 //I want: 'a', 'b', 'c', 0x12, 'e', 0x00 //Error, hex is too big because last e is treated as part of hex thus becoming 0x12e char problem[] = "abc\x12e"; […]

为什么int x 错误,其中n是一个常量值?

我不明白为什么这样做是错误的: const int n = 5; int x[n] = { 1,1,3,4,5 }; 即使n已经是一个常量值。 虽然这样做似乎是正确的GNU编译器: const int n = 5; int x[n]; /*without initialization*/ 我知道C99的VLA特性,我认为它与发生的事情有关,但我只需要澄清一下在后台发生的事情。

有没有什么理由不使用固定宽度的整数types(例如uint8_t)?

假设你正在使用一个支持C99的编译器(甚至只是stdint.h),有什么理由不使用固定宽度的整数types,如uint8_t? 我知道的一个原因是,在处理字符而不是使用(u)int8_t s时,使用char s更有意义,正如这个问题所提到的。 但是,如果你打算存储一个数字,你想什么时候使用一个你不知道它有多大的types呢? 也就是说,在什么情况下,你要存储一个数字在一个unsigned short而不知道是8,16甚至32位,而不是使用uint16t ? 接下来的是,使用固定宽度的整数或使用正常的整数types是不是更好的做法,只要不需要知道它们使用了多less个字节,就不要假设任何东西和sizeof 。