Tag: c99

结构vs字符串文字? 只读与读写?

C99标准是否允许写复合文字(结构)? 它似乎不提供写文字字符串。 我问这个是因为它在C编程:现代方法,第 406页第2版​​中说 。 问:允许指向复合文字的指针似乎可以修改文字。 是这样的吗? 答:是的。 复合文字是可以修改的左值。 但是,我不知道它是如何工作的,以及它如何与字符串文字一起工作,你当然无法修改。 char *foo = “foo bar”; struct bar { char *a; int g; }; struct bar *baz = &(struct bar){.a = “foo bar”, .g = 5}; int main () { // Segfaults // (baz->a)[0] = ‘X’; // printf( “%s”, baz->a ); // Segfaults // foo[0] = […]

为什么C99中不包含定点类型?

值得庆幸的是, complex类型修饰符被引入C99标准。 我不明白为什么决定省略对定点运算的支持(特别是支持分数类型,如1.15 {signed}或0.32 {unsigned}),这些类型对DSP编程如此重要? GCC是否通过扩展支持这些?

C99标准有什么意义?

C99为该语言添加了一些有用的function,但我发现很难推荐任何依赖于C99的练习。 这是因为C99语言的实际实现很少(任何?)。 当然,在一些编译器中支持有限,但没有人愿意花时间编写C代码只是为了让它不可移植。 考虑到该标准是在10年前编写并最终确定的,这令人沮丧。 另外,我不时会听到有关C1x的讨论,我想知道为什么有人会采取措施修改语言,因为当前版本的语言尚未实施。 所以我的问题是,作为乔今天的C程序员,我对C99标准有什么用处(如果有的话)?

这个指针构建是否会破坏严格的别名规则?

这是Quake III Arena的快速反平方根实现: float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df – ( i >> 1 ); // what? y = […]

_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);

我在哪里可以找到每个C99字符集的所有字符的表格?

我正在为以下每个C字符集中的每个字符寻找一个表(或生成一个表的方法): 基本字符集 基本执行字符集 基本源字符集 执行字符集 扩展字符集 源字符集 C99在5.2.1节中提到了所有这六个。 但是,我发现阅读非常神秘,缺乏细节。 它明确定义的唯一字符集是基本执行字符集和基本源字符集 : 拉丁字母表中的52个大写和小写字母: ABCDEFGHIJKLMNOPQRSTU VWXYZ abcdefghijklmnopqrstu vwxyz 十位小数: 0 1 2 3 4 5 6 7 8 9 29个图形字符: ! “#%&’()* +, – 。/:; ?[\ _] ^ _ {|}〜 4个空格字符: 空格,水平标签,垂直标签,换页 我相信这些与基本字符集相同,但我猜测C99没有明确说明这一点。 其余的字符集对我来说有点神秘。 谢谢你尽你所能的帮助! 🙂

将堆分配的指针强制转换为指向VLA的指针是否安全?

如果我有一个指向某个堆分配空间的指针,该空间代表一个典型的行主要二维数组,是否可以将此指针强制转换为指向VLA的等效指针以方便子脚本编写? 例: // // Assuming ‘m’ was allocated and initialized something like: // // int *matrix = malloc(sizeof(*matrix) * rows * cols); // // for (int r = 0; r < rows; r++) { // for (int c = 0; c < cols; c++) { // matrix[r * cols + c] = some_value; // } […]

可变长度数组

我想知道如何管理可变长度数组(为了拥有可变长度数组,在堆栈上保留了哪些额外的变量或数据结构)。 非常感谢。

我无法理解C99中的一些句子

在C99 6.5中说: 在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。 此外,先前的值应该是只读的,以确定要存储的值 什么“此外,先前的值只能读取以确定要存储的值”是什么意思? 在C99中,为什么a[i++] = 1是未定义的行为?

GCC选项强制执行A​​nsi C标准检查?

我应该使用哪些gcc选项来强制执行A​​NSI C(C99)警告/错误? gcc(GCC)3.4.2(mingw-special) 我正在使用:gcc -pedantic -ansi -std = c99这是正确的吗?