Tag: c99

使用gcc编译器隐式int和隐式声明函数

我读了c99标准: -remove implicit function declaration, -remove implicit int. 但是当我尝试使用-pedantic在c99模式下使用gcc编译器编译此代码时 main(void){ f(3); return 0; } int f(int a){ …. } 我期待2个错误,但我只收到2个警告: -warning: return type defaults to ‘int’ -warning: implicit declaration of function ‘f’. 它们不应该是c99中的错误吗? http://gcc.gnu.org/c99status.html在这两种情况下都写有“完成”。 谢谢。

C(非C ++)的exception库

我正在为C推出我自己的exception库,并希望检查好的例子。 到目前为止,我一直在关注David Hanson: http : //drhanson.net/work/ 但我知道我过去见过其他可用的东西。 你能给我一些额外的指示吗? 谢谢, 那么setjmp

为什么新的C书不符合C99标准?

几乎所有关于c编程的(相对)新书似乎都没有遵循C99标准,或者他们在一个额外的章节中介绍它。 从Java背景来看,C99标准使我的迁移(嗯,仍在迁移^^)变得更加容易,这也可能适用于其他语言。 似乎C99尚未到达大多数C开发人员。 但为什么?

数组为复合文字

在C99中,我们可以将复合文字用作未命名的数组。 但是这个文字常量是例如100 , ‘c’ , 123.4f等。 我注意到我能做到: ((int []) {1,2,3})[0] = 100; 并且,我没有编译错误,并且可以猜测该未命名数组的第一个元素是用100修改的。 所以它似乎作为复合文字的数组是左值而不是常量值。

澄清整数常量表达式

在某处我读到整数常量表达式包含整数常量,例如: (5 + 5) //integer constant expression 这是我见过的唯一例子。 现在,从标准说: (C99 6.6 / 6)整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量。 整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof运算符的操作数的一部分。 那么,如果我是对的,下面是所有这些整数表达式吗? int i; float f = 3.14f; i = 42; i = f; i = (int)(5/3.14f);

如何消除“丢弃限定符”警告?

使用GCC和C99模式,我有一个声明为: void func(float *X); 当我调用该函数时,我使用了一个易失性数组Y: volatile float Y[2]; int main() { func(Y); return 0; } 编译时(使用-Wall ),我收到以下警告: warning: passing argument 1 of ‘func’ discards qualifiers from pointer target type blah.c:4: note: expected ‘float *’ but argument is of type ‘volatile float *’ 我可以使用显式(float *)类型转换来消除它,但这在代码中的许多地方重复。 有没有办法消除这个特定的警告,有一个选项或一个pragma(或等效的东西)?

何时在C中使用可变长度数组,但是在动态分配时?

我在C99中找到了可变长度数组,但看起来它的行为与malloc + free几乎相同。 我找到的实际差异: 太大的arrays处理: unsigned size = 4000000000; int* ptr = malloc(size); // ptr is 0, program doesn’t crash int array[size]; // segmentation fault, program crashes 内存泄漏:只能在动态数组分配中使用: int* ptr = malloc(size); … if(…) return; … free(ptr); 对象的生命和从函数返回的可能性:动态分配的数组生命直到内存被释放,并且可以从分配内存的函数返回。 resize:仅使用指向已分配内存的指针resize。 我的问题是: 有什么更多的差异(我对实用建议感兴趣)? 程序员可以使用两种具有可变长度的数组的方式有什么问题? 何时选择VLA但是在动态arrays分配时? 什么是更快:VLA或malloc +免费?

我可以省略C中main的返回吗?

在C ++中,3.6.1主要function (3.6.1 / 5)main中的return语句具有离开main函数(销毁具有自动存储持续时间的任何对象)并以返回值作为参数调用exit的效果。 如果控制到达main的末尾而没有遇到return语句,则效果是执行return 0; 我可以在C99中执行以下操作而不返回0吗? int main() { }

如何在Visual Studio中“模拟”C99以进行变量声明

我正在使用Visual Studio 2012开发简单的Win32 C程序。 我知道VS编译器只支持C89,但我想知道是否有办法覆盖这个限制。 特别是我想在我的代码中的任何地方声明变量,而不是仅在范围块的开头声明(如C89所要求的)。 提前致谢。

通过示例了解限制限定符

restrict关键字的行为在C99中由6.7.3.1定义: 设D是普通标识符的声明,它提供了一种将对象P指定为类型T的限制限定指针的方法。 如果D出现在块内并且没有存储类extern,则让B表示该块。 如果D出现在函数定义的参数声明列表中,则让B表示关联的块。 否则,让B表示main的块(或者在独立环境中的程序启动时调用任何函数的块)。 在下文中,指针表达式E被称为基于对象P if(在评估E之前执行B中的某个序列点)修改P以指向其先前指向的数组对象的副本将改变E.119的值)注意”based”仅针对具有指针类型的表达式定义。 在每次执行B期间,让L为任何具有&L基于P的左值。如果L用于访问它指定的对象X的值,并且X也被修改(通过任何方式),则以下要求适用:T不应该是const限定的。 用于访问X值的每个其他左值也应具有基于P的地址。出于本子条款的目的,每次修改X的访问也应被视为修改P. 如果P被赋予指针表达式E的值,该指针表达式E基于与块B2相关联的另一个受限指针对象P2,则B2的执行应在执行B之前开始,或者B2的执行应在该执行之前结束。分配。 如果不满足这些要求,则行为未定义。 就像其他人一样,我很难理解这个定义的所有复杂性。 作为这个问题的答案,我希望看到第4段中每个要求违反要求的一些好例子。 本文: http://web.archive.org/web/20120225055041/http://developers.sun.com/solaris/articles/cc_restrict.html 在“编译器可能假设……”方面做得很好。 扩展该模式并将编译器可以做出的假设以及它们如何无法保持,每个示例都很棒。