相关疑难解决方法(0)

sizeof(enum)== sizeof(int),总是吗?

sizeof(enum)== sizeof(int),总是吗?

  • 还是编译器依赖?
  • 这是错误的,因为编译器针对字长度(内存对齐)进行了优化,即y int是特定编译器上的字大小?如果我使用枚举,这是否意味着没有处理惩罚,因为它们将是字对齐的?
  • 如果我将所有返回代码放在枚举中是不是更好,因为我显然不担心它获得的值,只检查返回类型时的名称.如果是这种情况,#DEFINE会更好,因为它可以节省内存.

通常的做法是什么?如果我必须通过网络传输这些返回类型,并且必须在另一端完成某些处理,那么您更喜欢枚举/ #define/const ints.

编辑 - 只是检查网络,因为编译器不象征性地链接宏,人们如何调试,比较整数值与头文件?

来自答案 - 我在下面添加这一行,因为我需要澄清 -

"因此它是实现定义的,而sizeof(枚举)可能等于sizeof(char),即1."

  • 这是否意味着编译器检查枚举中的值范围,然后分配内存.我不这么认为,当然我不知道.有人可以解释一下"可能是什么".

c enums const c-preprocessor

58
推荐指数
4
解决办法
6万
查看次数

使用可变长度数组有任何开销吗?

使用可变长度数组有一些开销吗?可以在运行时通过命令行参数传递数组的大小吗?与自动和动态分配数组相比,为什么会引入它?

c arrays variable-length-array

46
推荐指数
2
解决办法
2万
查看次数

C11之后是否有未来C标准的计划?

我在开放标准网站上搜索,特别是C工作组主页,但只找到了有关C11的信息.

他们似乎定期开会并讨论不同的功能和扩展,但他们实际上从未提及未来的C标准或路线图.很难说他们是在制定新标准还是仅仅是当前标准的技术勘误.

c iso c11

42
推荐指数
2
解决办法
6013
查看次数

为什么int x [n]错误,其中n是一个const值?

我不明白为什么这样做是错的:

const int n = 5; 
int x[n] = { 1,1,3,4,5 };
Run Code Online (Sandbox Code Playgroud)

即使n已经是const值.

虽然这样做似乎适合GNU编译器:

const int n = 5;
int x[n]; /*without initialization*/
Run Code Online (Sandbox Code Playgroud)

我知道C99的VLA功能,我认为这与正在发生的事情有关,但我只需要澄清背景中发生的事情.

c arrays const c99

38
推荐指数
3
解决办法
2836
查看次数

C中文件范围的可变修改数组

我有一些像这样的代码:

static int a = 6;
static int b = 3;

static int Hello[a][b] =
{
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3}
};
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时,它说错误:

在文件范围内可变地修改了"Hello"

怎么会发生这种情况?我该怎么办呢?

c arrays static

30
推荐指数
2
解决办法
6万
查看次数

在哪种情况下应该使用匿名枚举?

在c和c ++中enum都可以用tag定义

enum e_smth {
    smth_one,
    smth_two,
    smth_err
};
Run Code Online (Sandbox Code Playgroud)

或没有标签

enum {
    smth_one,
    smth_two,
    smth_err
};
Run Code Online (Sandbox Code Playgroud)

如果它是用tag定义的,那么switch在c和c ++ 中的语句中都是有意义的:

e_smth some_var;
....//do some stuff with some_var
switch (some_var)
{
case smth_one:
break;
case smth_two:
break;
}
Run Code Online (Sandbox Code Playgroud)

-Wswitch如果用gcc或g ++编译它会产生 警告.

它在c ++中的函数声明和变量初始化中是有意义的:

e_smth var;
var=99;
Run Code Online (Sandbox Code Playgroud)

-fpermissive如果用g ++编译会产生错误.

带或不带标记的两种类型都可以用作#define没有参数的一个文件宏.


更新

可以用作#define没有参数的一个文件宏

意思是:而不是在文件范围内写入#define MAX 1000文件并将MAX添加到全局使用enum { MAX=1000 }


那么匿名枚举,我发现只有一个用例:定义就像使用typedef enum { a,b,c } some_t;带标签的枚举一样

题:

如果我还没有描述所有合理的用例,应该使用匿名枚举的内容?

c c++

12
推荐指数
2
解决办法
1万
查看次数

为什么不能使静态数组的大小变量?

可能重复:
我们可以给静态数组的大小一个变量

我在其中一个子文件中定义一个数组,如下所示.

static int arr[siz];
Run Code Online (Sandbox Code Playgroud)

siz是子文件可用的全局变量.但是gcc编译器会产生以下错误:

<filename>: <line_num> : error : storage size of ‘arr’ isn’t constant
Run Code Online (Sandbox Code Playgroud)

为什么我不能定义一个static可变大小的数组?

编辑:这似乎只是static int类型的问题.如果我将变量类型arrfrom 更改static intint,则错误消失,即使数组的大小仍依赖于变量siz.

c arrays static gcc

12
推荐指数
2
解决办法
2万
查看次数

在C中,为什么const变量不能用作数组大小初始值设定项?

在以下代码中,const int不能用作数组大小:

const int sz = 0;
typedef struct
{
   char s[sz];
} st;

int main()
{
   st obj;
   strcpy(obj.s, "hello world");
   printf("%s", obj.s);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c

12
推荐指数
3
解决办法
4903
查看次数

为什么在 C 中 const 对象不是编译时常量表达式?

在 C 中,const限定符使对象只读,但不是常量表达式。例如,不可能使用const int变量来确定数组的维度:

const int n = 10;
int arr [n];         /* Compile-time error */
Run Code Online (Sandbox Code Playgroud)

这其中的技术原因是什么?难道编译器在编译时就不可能知道该对象实际上有一个常量值吗?


我不认为我的问题与Can a const variable be used to statements the size of an array in C?完全相同。 因为我不是在问这是否可能(我的问题中明确指出这是不可能的),而是问为什么这是不可能的技术原因。


在下面奥拉夫的评论、这个答案和一些思考之后,我将尝试以这种方式总结和回答我的问题:

在 C 中,const对象不是编译时常量,因为它可能违反这两个要求:

首先,可以const在运行时初始化对象,如下所示:

int i;
scanf ("%d", & i);
const int n = i;
Run Code Online (Sandbox Code Playgroud)

所以这里我们违反了“编译时已知”的要求。

其次,正如Olaf指出的,const限定符意味着程序本身在声明-初始化之后不会修改对象的值。但是内存中对象的值仍然可以被程序本身之外的其他实体修改,因此这里我们不保证实际常量的要求。

如果此答案不正确或不完整,请批评。

c expression constants compile-time

8
推荐指数
1
解决办法
5933
查看次数

枚举成员可以是ANSI-C中数组的大小吗?

我需要根据有多少元素来分配数组enum.我做了以下事情:

enum { A, B, C, LAST };
char buf[LAST];
Run Code Online (Sandbox Code Playgroud)

这很好,即使有-ansi -pedantic旗帜也行.但我不确定它是GCC还是clang(它支持大多数,如果不是所有的GCC扩展)扩展或ANSI C标准真正允许,并且在任何带有ANSI-C标准的C编译器中都能正常工作.有人可以澄清一下吗?

c standards gcc clang c89

6
推荐指数
1
解决办法
1579
查看次数

C中带有const变量的数组大小

我发现了一个有趣的事实,我不明白它是如何工作的.
以下代码完美无缺.

#include <stdio.h>
 int main(){
  const int size = 10;
  int sampleArray[size];
  typedef char String [size];
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后,我试图只使用具有全局范围的常量变量,并且它仍然很好.

#include <stdio.h>
const int size = 10;
 int main(){
  int sampleArray[size];
  typedef char String [size];
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


但是,如果我将数组的范围也改为全局,我得到以下结果:

错误:在文件范围内修改了'sampleArray'

#include <stdio.h>
const int size = 10;
int sampleArray[size];
typedef char String [size];
 int main(){
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我没有得到它!如果我将ex替换为const变量.以#define它会好起来为好.
我知道#define变量是预处理的,据我所知,const变量只是只读的.但究竟什么才能成为全球范围的?

我不明白第三段代码有什么问题,如果第二段代码还可以.

c arrays scope const

6
推荐指数
1
解决办法
2580
查看次数

为什么使用const不允许变量大小的对象初始化

这是错误的,因为可能无法初始化可变大小的对象

int size = 4;
int array[size] = {1};
Run Code Online (Sandbox Code Playgroud)

size是一个变量,但编译器在创建时是否知道它的值array(size在编译时没有为初始值4分配?)?让我们size改变之后,为什么会出现这个问题呢?我的意思是,这些是连续的指令,什么可能改变size数组声明之前的值?

第二个问题:为什么不允许这样做:

const int size = 4;
int array[size] = {1};
Run Code Online (Sandbox Code Playgroud)

我宣称size是一个常数.我知道const!=只读,并且声明size为宏是正确的方法.但是,如果我保证编译器使用const我不会改变它的值size,为什么不允许?

c compiler-construction const

4
推荐指数
1
解决办法
285
查看次数

无法编译固定大小的静态数组

最小代码示例:

#include <stdio.h>
int main()
{
    const int a = 5;
    static int b[a];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

看起来很好,是吗?变量a是不变的.也适用于4.4.

gcc -v
gcc version 6.2.1 20160830 (GCC)
gcc 1.c
1.c: In function ‘main’:
1.c:6:16: error: storage size of ‘b’ isn’t constant
     static int b[a];
Run Code Online (Sandbox Code Playgroud)

顺便说一下,clang很好地编译了这段代码.

c gcc clang

1
推荐指数
1
解决办法
218
查看次数