在C中的以下陈述中哪一个更好用?
static const int var = 5;
Run Code Online (Sandbox Code Playgroud)
要么
#define var 5
Run Code Online (Sandbox Code Playgroud)
要么
enum { var = 5 };
Run Code Online (Sandbox Code Playgroud) 使用static constvars比#define预处理器更好吗?或者也许取决于背景?
每种方法的优点/缺点是什么?
我在以下程序的第6行(初始化my_foo到foo_init)时收到错误,我不确定我理解为什么.
typedef struct foo_t {
int a, b, c;
} foo_t;
const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请记住,这是我正在研究的大型多文件项目的简化版本.目标是在目标文件中有一个常量,多个文件可用于初始化状态结构.由于它是一个资源有限的嵌入式目标,并且结构不是那么小,我不想要源的多个副本.我不想使用:
#define foo_init { 1, 2, 3 }
Run Code Online (Sandbox Code Playgroud)
我也在尝试编写可移植代码,所以我需要一个有效的C89或C99解决方案.
这是否与目标文件中的ORG有关?初始化变量进入一个ORG并通过复制第二个ORG的内容进行初始化?
也许我只需要改变我的策略,并在启动时使用初始化功能完成所有副本.除非有其他想法吗?
我想创建一个在我的Objective-C实现文件中使用的常量静态数组,类似于我的".m"文件的顶层.
static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = {
1,
2,
3,
4 };
Run Code Online (Sandbox Code Playgroud)
我打算NUM_TYPES稍后在文件中使用,所以我想把它放在一个变量中.
但是,当我这样做时,我得到了错误
"在文件范围内修改了'类型'"
我认为这可能与数组大小是变量有关(当我在那里放一个整数文字时,我不会收到此消息static int types[4]).
我想解决这个问题,但也许我说这一切都错了......我在这里有两个目标:
NUM_TYPES到变量中,所以我的文件中的不同位置没有相同的文字有什么建议?
[编辑]在C Faq中找到了这个:http://c-faq.com/ansi/constasconst.html
为什么以下代码会抛出错误?
const int a = 5;
int b[a]={1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)
而且当我尝试编译没有"const"关键字的上述代码时,我得到了同样的错误:
int a = 5;
int b[a]={1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我在这里做的错误是什么?
还有另一个问题:什么时候常量被代码中的实际值替换,即如果我声明一个变量说:const int x = 5; 我知道在RAM中没有为变量x分配内存,但是ROM中的常量变量区域保持值5,并且x在代码中出现x的地方简单地替换为值5.但这什么时候发生的?编译时间?启动时间?预处理时间?
PS:我说的是嵌入式C(在微控制器上运行等),而不是在桌面上运行的C. 因此嵌入式系统必然会有一个ROM(Flash,EEPROM ......).那会发生什么?
我把我的main.c文件用Mac OS X中的gcc -std = c1x -c main.c编译,它没有错误,工作正常.然后我在LinuxMint和Raspberry Pi上执行完全相同的操作,在这两种情况下,它都给出了"初始化元素不是常量"的错误.
带有相关代码的问题行的一个示例:
//STATIC GLOBAL CONSTANTS
const unsigned long long LATITUDE = (long) 3600000;
const unsigned long long LONGITUDE = (long) 1810000;
const unsigned long long MAX_COORDINATES_NUMBER = (LATITUDE-1) + LATITUDE*(LONGITUDE-1); //compiler error: initializer element is not constant
Run Code Online (Sandbox Code Playgroud)
它应该让我做算术,对吗?我可以用实际数字替换它,它会起作用,但随后会变得混乱.无论如何,它在我的Mac上运行良好.在GCC中是否有一些选项我必须在Linux上指定(除了-std = c1x,你在Mac上也不需要)?
在以下代码中,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) 当我尝试运行它时,它给出了一个错误,说变量中的值a不是常量.这对我没有意义,因为我明确地使变量a保持不变.数组的大小是否必须更加恒定?只是意义,#define a 5或者将其初始化为int arr[5]或使用malloc?我做了什么错了?
int main{
const int a = 5;
int i;
int arr [a];
for (i = 0; i < 5; i++) {
arr[i] = i * 2;
}
printf("%d", arr[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我使用以下代码.
const int X_ORIGIN = 1233086;
const int Y_ORIGIN = -4728071;
const int Z_ORIGIN = 4085704;
const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};
Run Code Online (Sandbox Code Playgroud)
当我编译它时,GCC给我以下错误.
Transformations.h:16:1:错误:初始化元素不是常量
那是什么意思?我该如何修复我的代码?
以下代码有什么问题?
#define DELAY_CYCLES ((int)(0.1/0.001))
typedef struct {
double state_history[N_X][DELAY_CYCLES];
double foo;
} foo
gcc抱怨:
main.h:52:3:警告:在文件范围内修改了'state_history'
是因为int cast由于某种原因无法在编译时完成吗?