sizeof(enum)== sizeof(int),总是吗?
通常的做法是什么?如果我必须通过网络传输这些返回类型,并且必须在另一端完成某些处理,那么您更喜欢枚举/ #define/const ints.
编辑 - 只是检查网络,因为编译器不象征性地链接宏,人们如何调试,比较整数值与头文件?
来自答案 - 我在下面添加这一行,因为我需要澄清 -
"因此它是实现定义的,而sizeof(枚举)可能等于sizeof(char),即1."
使用可变长度数组有一些开销吗?可以在运行时通过命令行参数传递数组的大小吗?与自动和动态分配数组相比,为什么会引入它?
我不明白为什么这样做是错的:
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功能,我认为这与正在发生的事情有关,但我只需要澄清背景中发生的事情.
我有一些像这样的代码:
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和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;带标签的枚举一样
如果我还没有描述所有合理的用例,应该使用匿名枚举的内容?
可能重复:
我们可以给静态数组的大小一个变量
我在其中一个子文件中定义一个数组,如下所示.
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 int为int,则错误消失,即使数组的大小仍依赖于变量siz.
在以下代码中,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 中,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限定符意味着程序本身在声明-初始化之后不会修改对象的值。但是内存中对象的值仍然可以被程序本身之外的其他实体修改,因此这里我们不保证实际常量的要求。
如果此答案不正确或不完整,请批评。
我需要根据有多少元素来分配数组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编译器中都能正常工作.有人可以澄清一下吗?
我发现了一个有趣的事实,我不明白它是如何工作的.
以下代码完美无缺.
#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变量只是只读的.但究竟什么才能成为全球范围的?
我不明白第三段代码有什么问题,如果第二段代码还可以.
这是错误的,因为可能无法初始化可变大小的对象
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,为什么不允许?
最小代码示例:
#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很好地编译了这段代码.