对于c和c++相同的程序,当我们使用常量整数变量作为case标签时,它只在c++中有效,而在c中不有效,当我们使用常量整数数组成员作为case标签时,它对c和c++都无效。这种行为的主要原因是什么?
//for c
#include <stdio.h>
int main()
{
const int a=90;
switch(90)
{
case a://error : case label does not reduce to an integer constant
printf("error");
b
我正在练习C语言,我发现了一个在case语句中使用算术运算符的程序。但是我知道算术运算不能在这样的地方使用。
那么这个程序是如何工作的呢?
#include <stdio.h>
int main()
{
int ch = 'a' + 'b';
switch (ch) {
case 'a':
case 'b':
printf("You entered b \n");
case 'A':
以下C++11程序:
int x = 42;
void f()
{
int y = 43;
static_assert(&x < &y, "foo");
}
int main()
{
f();
}
没有与gcc 4.7一起编译,因为它抱怨:
error: ‘&y’ is not a constant expression
这符合我的直觉。y的地址可能会随着每次调用f而发生变化,因此在翻译期间当然不能计算它。
然而,5.19 expr.const中的要点似乎不排除它是一个常量表达式。
我看到的唯一
我试图在switch语句中使用cons int标签,但是我一直收到错误,虽然case标签是const int变量,但是case标签没有还原为整数常量。我像这样定义了const int变量:
const int ADD = 6;
const int AND = 7;
const int OR = 8;
const int XOR = 9;
const int SLT = 10;
const int SLL = 11;
const int SRA = 12;
const int SUB = 13;
我在switch语句中使用它们,如下所示:
switch(alu_op_code)
{
示例
int main()
{
const int i = 1.0; // Notice I am assigning a double to an int here
char a[i];
}
问题
使用g++ -O0 -Wall -pedantic -ansi -std=c++11编译上述代码不会产生任何错误(除了一个未使用的变量)。但是,如果删除-std=c++11,则会收到以下警告:
警告: ISO C++禁止可变长度数组
根据,我认为在C++03中,代码是无效的。但是,有人能解释一下C++11中的规则是如何变化的吗?
(这个问题是我回答的的结果。)
在我使用的下一行代码中进行一些更改:
uint a = b == c ? 0 : 1;
向我显示了以下错误:
不能隐式地将类型'int‘转换为'uint’。存在显式转换(是否缺少强制转换?)
但如果我用密码:
uint a;
if (b == c)
a = 0;
else
a = 1;
它工作正常,没有任何错误或警告。为什么?
const复合文字是static变量的有效初始化器吗?
#define COMPOUND ((const int [2]){1, 2})
static const int x = COMPOUND[0];
/* static const int x = 1; should be equivalent */
编辑:
第一个注释中可能出现的重复没有意义,因为我明确询问的是const文本,而不是变量。
与gcc一起编译以下代码。
代码:
#include <stdio.h>
const int i = 10;
const int n = i+1;
int main() {
printf("%i\n", i);
printf("%i\n", n);
}
错误:
我得到一个编译错误,如下所示
test.c:3:5: error: initializer element is not constant
const int n = i+1;
^
用g++编译很好,可以打印10和11。
我用gcc 4.9.2
我找到了这样的描述,关于创建一个字符串的散列到一个大小:
我想使用这个宏来初始化一个全局变量。我不想在编译后的二进制文件中添加字符串,只想添加散列。
但是在使用这个宏时,我得到了错误:error:Initializer element is not constant
有没有针对C& GCC编译器的变通方法?
还有没有其他想法可以通过预处理器来放置字符串的哈希值?
我在库项目中有一个从R.java引用资源I的开关:
switch (code) {
case R.id.code_one:
blah();
break;
case R.id.code_two:
bleh();
break;
}
从ADT 14,R字段不再是最终的,所以Google建议将切换改为嵌套的if。
然而,我不知道为什么这不起作用:
final int CODE_ONE=R.id.code_one, CODE_TWO=R.id.code_two;
switch (code) {
case CODE
我有一个非常长的String常量,用于注释,这个字符串本质上是一个逗号分隔的列表。我希望能够做到以下几点: String str = String.join(", ", "abc", "def", "ghi", "jkl");
@Annotation(str)
public void foo(); 但是我得到了错误element value must be a constant expression。我知道这个表达式不符合Java对常量表达式的定义,但是,有没有办法向编译器断言str是常量呢?如果我能以上面的方
constexpr int func(int rf){
constexpr int v = rf; // #1
return 0;
}
int main(){
}
考虑到上面的代码,编译器抱怨这样的代码是ill-formed。在这里:
error: 'rf' is not a constant expression
也就是说,标记为#1的位置上的表达式由编译器计算。我同意rf不是一个常量表达式,因为它确实违反了以下规则:
表达式e是核心常量表达式,除非e的计算遵循抽象机器的规则计算下列表达式之一:
从lvalue到rvalue的转换,除非应用于
文本中的错误消息:
我正在研究“C++入门”一书,在为一个练习编写答案时遇到了下面列出的问题:
#include<iostream>
#include<vector>
using namespace std;
int main() {
int i = 3;
const int ci = 3;
size_t si = 3;
const size_t csi = 3;
int ia[i];
int cia[ci];
int sia[si];
int csia[csi];
int another_a[] = {1,2,3};
int *pi = begin(ia);
以下(诚然是人为的)C程序无法编译:
int main() {
const int array[] = {1,2,3};
static int x = array[1];
}
在使用gcc (或微软的CL.EXE)编译上面的C源文件时,我得到以下错误:
error: initializer element is not constant
static int x = array[1];
^
这样简单直观的语法当然是有用的,所以这看起来应该是合法的,但显然不是。当然,我不是唯一一个对这个明显愚蠢的限制感到沮丧的人。我不明白为什么这是不允许的--C语言试图通过使这个有
我来自javascript/php/python,可能遗漏了一些东西,下面是代码:
const int a = 50;
const int c = 100;
const int d = 100;
int endX = c + a;
int endY = d;
int startX, startY, b;
我得到了
ex1.4.c:6:错误:初始化元素不是常量
ex1.4.c:7:错误:初始化元素不是常量
有人有解释吗?
我试图为我的结构指针分配内存,我是全局声明的。但是我得到了这个错误-> error: initializer element is not constant
typedef struct A {
uint32_t arr[30][4096];
uint32_t var1;
uint8_t var2;
bool var3;
}B;
B *x = (B*)malloc(sizeof(B));
有人能解释我在哪里做错了吗。另外,与动态内存分配相比,是否有一种将内存分配给结构指针的直接方法?提前谢谢。