Tag: ansi c

所有结构标识符都自动向前声明

在回答警告:从链表数组的不兼容指针类型进行赋值时 ,我注意到任何用struct关键字识别的未声明标识符都被视为前向声明的标识符。 例如, 下面的程序编译得很好: /* Compile with “gcc -std=c99 -W -Wall -O2 -pedantic %” */ #include struct foo { struct bar *next; /* Linked list */ }; int main(void) { struct bar *a = 0; struct baz *b = 0; struct foo c = {0}; printf(“bar -> %p\n”, (void *)a); printf(“baz -> %p\n”, (void *)b); […]

字符串数组初始化

这是我的另一个问题的延续。 请考虑以下代码: char *hi = “hello”; char *array1[3] = { hi, “world”, “there.” }; 它没有编译到我的意外(显然我不知道C语法以及我认为)并生成以下错误: error: initializer element is not constant 如果我将char *更改为char [],则编译正常: char hi[] = “hello”; char *array1[3] = { hi, “world”, “there.” }; 有人可以向我解释原因吗?

C程序对三个命令执行管道

我必须编写一个程序来执行与du |相同的操作 排序| 在命令行的头会做,但我卡住了,我的程序不工作。 现在的输出是112。 并且该程序不会终止。 请帮忙,我不知道该怎么办! int main(void) { int fd[2]; int fd1[2]; int pid; if (pipe(fd) == -1) { perror(“Pipe”); exit(1); } switch (fork()) { case -1: perror(“Fork”); exit(2); case 0: dup2(fd[1], STDOUT_FILENO); close(fd[0]); close(fd[1]); execl(“/usr/bin/du”, “du”, (char *) 0); exit(3); } if (pipe(fd1) == -1) { perror(“Pipe”); exit(1); } switch (fork()) { […]

我应该使用“-ansi”或显式“-std = …”作为编译器标志吗?

我已经读过 ANSI C与ISO C不完全相同,编译器可能在解释“-ansi”的含义上有所不同。 (gcc将其映射到C90,clang将其映射到C89)目前我倾向于使用“-std = …”而不是“-ansi”,因为它明确地显示了使用哪个标准。 由于我特别感兴趣的是在Linux,Windows和MAC上编译,我担心一些编译器无法理解“-std = …”而是“-ansi”。 那么使用一个在另一个上有任何利弊吗?

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

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

C中的多维数组:它们是锯齿状的吗?

关于C编程语言(ANSI-C)的一个简单问题: C中的多维数组是锯齿状的吗? 我的意思是 – 我们在谈论“数组数组”(一个指向内存中其他地址的指针数组),或者这只是“长一维数组”(它是按顺序存储在内存中)? 困扰我的是我有点确定: matrix[i][j]相当于* ( * (matrix + i) + j)

ANSI C与其他C标准

在我使用的几个编译器(所有gcc但各种版本)上,我得到一个C99 mode错误,比如在for循环表达式中而不是在它之前声明int i (如果我不使用std=c99选项)。 在这里阅读后我明白了gcc选项-ansi , -std=c89和-std=iso9899:1990都符合ANSI C标准, 但我不明白为什么/如果我应该选择c89标准而不是更新标准如c99 (这是我假设的最新版本)。 此外,我看到C语言的iso类型标准的多个版本,其中第一个(根据我的理解)是ANSI标准的直接端口。 是否可以说iso将更新其C标准,但C的原始ANSI标准将始终相同? 奖金问题: 我实际上可以自己弄清楚这个,我还没有花时间去做,所以如果有人知道他们的头顶那么这很好,否则没什么大不了的,我会在以后想出来的:) 我有一本相当新The C Programming Language (ANSI) 。 我的书总是显示如下循环: int i; for(i = 0; i < foo; i++) 但很多人(他们的小指中有大多数编程人才)都会像这样编写for循环: (int i = 0; i < foo; i++) 如果我以第一种方式编写循环然后i应该可以访问整个函数是正确的,但如果我以第二种方式编写它,那么i只能访问for循环REGARDLESS我编译的标准是什么? 另一种问同样问题的方法,如果我使用c89标准进行编译,那么两个for循环的i都可以被整个函数访问,如果我用c99标准编译,那么第一个for循环的i可以被整个函数访问而第二个for循环的i只能通过for循环访问?

如何在C99运行时计算可变长度数组的大小?

在C89中,数组的长度在编译时是已知的。 但在C99中,对于可变长度数组,数组的长度在运行时可能是未知的。 那怎么计算呢? 为什么不能以相同的方式计算动态分配的数组的长度?

ANSI C相当于try / catch?

我有一些我正在使用的C代码,我在代码运行时发现错误,但是关于如何正确执行try / catch(如C#或C ++)的信息很少。 例如在C ++中,我只是这样做: try{ //some stuff } catch(…) { //handle error } 但在ANSI C中,我有点迷失。 我尝试了一些在线搜索,但是我没有看到关于如何实现这一点的足够信息/想象我会问这里以防万一有人能指出我正确的方向。 这是我正在使用的代码(相当简单,递归的方法),并希望用try / catch(或等效的error handling结构)进行包装。 但是我的主要问题是如何在ANSI C中执行try / catch …实现/示例不必是递归的。 void getInfo( int offset, myfile::MyItem * item ) { ll::String myOtherInfo = item->getOtherInfo(); if( myOtherInfo.isNull() ) myOtherInfo = “”; ll::String getOne = “”; myfile::Abc * abc = item->getOrig(); […]

谁定义了C运算符优先级和关联性?

介绍 在C / C ++的每本教科书中,您都可以找到运算符优先级和关联表,如下所示: http://en.cppreference.com/w/cpp/language/operator_precedence StackOverflow上的一个问题是这样的问题: 以下函数的执行顺序如下: f1() * f2() + f3(); f1() + f2() * f3(); 参考上面的图表,我自信地回答说函数具有从左到右的关联性,因此在前面的语句中,在这两种情况下都会像这样评估: f1() – > f2() – > f3() 评估函数后,您完成评估,如下所示: (a1 * a2)+ a3 a1 +(a2 * a3) 令我惊讶的是,很多人告诉我,我错了。 决心certificate他们错了,我决定转向ANSI C11标准。 我再一次惊讶地发现在运算符优先级和关联性方面提到的很少。 问题 如果我认为函数总是从左到右进行评估是错误的,那么表中涉及函数优先级和关联性的真正含义是什么? 谁定义了运算符优先级和关联性,如果它不是ANSI? 如果是ANSI的定义,为什么很少提到运算符优先级和关联性? 运算符优先级和关联性是从ANSI C标准推断还是在数学中定义?