在C编程中,我遇到了一种情况:我意外地初始化了一个大小可变的数组,并且它起了作用。我做了一些研究,显然可变长度数组可以从C99编译中获得。显然,GCC 4.8.2的默认编译选项是C98。
下面是我用来测试的代码:
#include "stdio.h"
#include "stdlib.h" // rand(), srand()
#include "time.h"
void printArray(const char* c) {
// impossible to get size of c because it returns point
根据我的记忆,下面这段代码应该可以在C++上很好地编译,但不能在C中编译,唯一的问题是如何测试它?它在g++上编译得很好,在gcc上也是如此。我假设g++是C++编译器,而gcc是C编译器。我已经在Windows下用mingw尝试过了。我说的对吗?如果不是,那么如何使用C编译器编译它。
int main() {
const int i = 1;
const int j = 2;
const int k = 3;
int array[i + j + k];
return 0;
}
C89 (C90,ANSI)不允许混合变量声明与代码.我想知道变量初始化在多大程度上被认为是“代码”。
也许只有用常量表达式进行初始化才有效?
具体来说,如果我正在编写C代码,并且我想要安全地运行(与ANSI编译器最大限度地兼容),那么应该将以下内容视为安全吗?
void f1(void) {
int x = 30;
int y = 40;
int z;
/* ... */
}
void f2(void) {
int x = 30, y = 40;
int z;
/* ... */
}
我们正在将C代码转换为C++。
我注意到下面的代码在C中定义得很好,
int main(){
//length is valid. '\0' is ignored
char str[3]="abc";
}
正如中所指出的那样:
“如果数组的大小已知,则可能小于字符串文本的大小,在这种情况下,将忽略终止空字符。”
但是,如果要在C++中构建相同的代码,则会得到以下C++错误:
error: initializer-string for array of chars is too long
[-fpermissive] char str[
在寻找unsigned long足以容纳size_t作为printf参数的证据时,我遇到了两个事实( to )。
首先,有一个指出,long确实不能保证对size_t来说足够大。另一方面,我看到这个建议在pre C99中使用printf("%lu", (unsigned long)x),x属于size_t。
所以问题是,你能不能假设或者保证long足够容纳size_t in pre C99。另一个问题是,是否有任何保证size_t将适合任何其他标准化整数类型(除了明显的例外,如ssize_t、ptrdiff_t等)。
在一个C实验室中,这个简单的代码出现了:
#include <stdio.h>
int suma (int a, int b)
{
return a+b;
}
int mult (int a, int b)
{
return a*b;
}
int main(void)
{
int a,b;
printf ("Operando 1: ");
scanf("%d",&a);
printf("Operando 2: ");
考虑到我知道编译器版本:
ANSI C 5.3.0 - GNU C Compiler with options: -lm -lcrypt -O2 -pipe -ansi -DONLINE_JUDGE
如果我想编写严格遵循标准的C程序,我怎么知道它采用了哪个C标准(C89、C99、C11、C17/18)?
我从一个网站上读到,C99取消了C语言中的变量必须在代码块的顶部声明的限制。我在下面的程序中进行了测试,这确实是真的,因为我没有得到任何错误。但在同一个程序中,如果我在for循环的第一个语句中声明了一个变量,我会得到错误:
'for' loop initial declarations are only allowed in C99 mode|
这里有两件事。既然确实允许在程序中间声明变量,就像我对i所做的那样,那么为什么不允许我在for循环语句中这样做呢?其次,如果我的编译器(代码块/gcc)还没有处于C99模式,为什么我在中间而不是顶部声明变量时没有得到一个错误?
#inc
GCC和ICC的默认C方言是GNU89。GNU89允许混合声明。
int i;
i = 0;
int j;
我从其他一些帖子(如 )中推断(错误),这意味着我可以做到。
for(int i=0; i<n; i++)
但是当我这么做的时候
error: 'for' loop initial declarations are only allowed in C99 mode
显然,混合声明和循环初始声明并不是一回事(也就是说,一种并不意味着另一种)。
如果我只有一个,我宁愿有循环初始声明。当然,我可以使用GNU99,但这不是重点。默认的是GNU89,它已经打破了一些C89规则
标题说明了一切。我正在使用GCC 4.7.1 (与CodeBlocks捆绑),我面临着一个奇怪的问题。考虑到这一点:
int main() {
unsigned char a = 0, b = 0, c = 0;
scanf("%hhu", &a);
printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
scanf("%hhu", &b);
printf("a = %hhu, b = %hhu, c = %hhu\n", a,
给定声明如下的enum:
enum {
A,
B,
C,
D
};
参照C++11标准第7.2节,一般的编译器支持是什么?具体而言,摘自第7.2.2节:
如果第一个枚举数没有初始化器,则对应常量的值为零。没有初始化器的枚举器定义给枚举器通过将前一个枚举器的值增加一个而得到的值。
我可以期待普通的现代编译器(GCC、Intel、Clang、CL、 others),的最新版本)给出同样的结果,即 A = 0**,** B = 1**,** C = 2**,和** D = 3**?**。