问题标签 [compile-time-constant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
536 浏览

c++ - 如何在 C++ 中有效地实现异构不可变对象的不可变图?

出于好奇,我正在编写一个编程语言文本解析器。假设我想将令牌的不可变(在运行时)图定义为顶点/节点。这些自然是不同的类型——一些标记是关键字,一些是标识​​符,等等。但是它们都有一个共同的特征,即图中的每个标记都指向另一个标记。该属性让解析器知道特定标记后面可能会出现什么 - 因此该图定义了语言的形式语法。我的问题是几年前我不再每天使用 C++,并且从那时起使用了许多高级语言,我的头脑在堆分配、堆栈分配等方面完全支离破碎。唉,我的 C++ 生锈了。

尽管如此,我还是想立即爬上陡峭的山坡,为自己设定目标,用这种命令式语言以最高效的方式定义这个图。例如,我想避免使用“new”在堆上分别分配每个令牌对象,因为我认为如果我可以说是背靠背分配这些令牌的整个图(以线性方式,如数组中的元素),根据参考原则的局部性,这将以某种方式有益于性能-我的意思是当整个图被压缩以沿着内存中的“线”占用最小空间时,而不是将其所有令牌对象放在随机位置,这是一个加号?无论如何,就像你看到的,这是一个非常开放的问题。

直接的问题是:创建这个图形对象的过程是什么?它是不可变的,并且认为结构在编译时是已知的,这就是为什么我可以并且想要避免按值复制东西等等 - 应该可以用文字组成这个图吗?我希望我在这里有意义......(这不是我第一次没有。)解析器将在运行时将图表用作编译器的一部分。仅仅因为这是 C++,我也会对 C 解决方案感到满意。非常感谢您提前。

0 投票
4 回答
2193 浏览

java - 静态数据结构

有没有办法在编译时创建 Map 或 Set 类型的数据结构?

我问这个的原因是因为我正在使用 App Engine,并且我有一些需要排序和搜索的数据结构,但它们是不变的,所以我想避免在开始时创建它们的时间成本 -向上。

0 投票
3 回答
162 浏览

visual-c++ - 这是VC++ 2010的BUG吗?关于在标头中声明常量对象

几行代码值一千字:

我有三个简单的文件:header.h、main.cpp、other.cpp

在编译最简单的项目时,VC++ 2010 报错如下:

我确信这是 VC++ 2010 的错误,因为以下两个参考:

  1. C++ 标准说:(在 n3126 的第 140 页)

    “声明为 const 且未显式声明为 extern 的对象具有内部链接。”

  2. MSDN

    “在 C 中,常量值默认为外部链接,因此它们只能出现在源文件中。在 C++ 中,常量值默认为内部链接,这允许它们出现在头文件中。

    const 关键字也可以用在指针声明中。”

0 投票
3 回答
1718 浏览

c++ - C++ 类/结构数据成员偏移量作为常量表达式

获取数据成员的偏移量就像这样简单:

我想让它成为一个常量编译时表达式(或使用类型特征)。例如,要使用它来实现使用成员偏移量的基于 SFINAE 的解决方案,使用它静态断言等。

更新:问题是 - 如何使其成为编译时表达式。不是它是否适用于 POD 类型,或者 C 库中是否有标准宏等。

0 投票
5 回答
52134 浏览

c# - 如何在 C# 中声明一个常量 Guid?

是否可以在 C# 中声明一个常量 Guid?

我知道我可以声明 a static readonly Guid,但是是否有允许我编写的语法const Guid

0 投票
2 回答
4761 浏览

java - 为什么 Java 常量除以零不会产生编译时错误?

可能重复:
1/0 是合法的 Java 表达式吗?

为什么这段代码会编译?

如果我查看编译的类文件,我可以看到 B 已被评估为 30,而 A 仍然是 7/0。

据我了解JSL,除以零的表达式不是常数。

参考:JLS 15.28

我的上述陈述是由于这一行:

编译时常量表达式是表示原始类型值的表达式

因此除以零不会被评估为原始值。

我真正不明白的是为什么编译器仍然允许这样做?为了清楚起见,我上面的代码使用“java.lang.ExceptionInInitializerError”使运行时崩溃

在我看来,编译器威胁任何最终的静态变量作为常量并评估它的编译时间。这意味着编译器已经尝试评估 A,但由于它是除以零,它就让它通过。没有编译时错误。但这看起来非常非常奇怪......编译器知道它是除以零并且它会在运行时崩溃,但它不会标记编译错误!

谁能向我解释为什么?

0 投票
3 回答
2405 浏览

c++ - 在哪里放置编译时常量数组?

假设我有一个存储前 10 个素数的数组,如下所示:

只要我有 1 个 .cpp 文件,这一切都非常简单。但是,如果我有多个 .cpp 文件,我真的不知道将这个数组放在哪里。

一个明显的解决方案是:

但是,这样做的问题是素数数组不再是编译时间常数。假设 x.cpp 想要进行一些涉及素数 [k] 的繁重计算,使用 ka 编译时间常数,它必须进行实际的内存查找。我不喜欢那样。

那么我应该把这个数组放在哪里,以便:

  1. 它在二进制文件中只有一次(不是每个 .cpp 文件一次)
  2. array[SOME_CONSTANT] 也是一个编译时常量

编辑

这个怎么样?


PS:即使是上面的“明显解决方案”也花了我相当长的时间来写。显然 const 变量默认具有内部链接,因此我必须在 primes.cpp 文件中添加“extern”以使其工作。

0 投票
6 回答
17864 浏览

c# - 在 C# 中将颜色定义为常量

我在 C# winforms 应用程序中设置了一些默认颜色,如下所示:

据我所知,对于我的目的而言, readonly 本质上是一个常数。如果我试图将这些定义为常量,编译器会指出它必须是编译时常量,而 Color 不是。

我是否可以将这些保持原样,或者有什么方法可以定义我应该注意的这些常量?

(目的只是为了有一个位置来更改所有颜色以进行日志记录。)

0 投票
1 回答
2877 浏览

c++ - 如何在 Visual C++ 中编译期间输出编译时数字常量?

Visual C++ 可以#pragma message字符串输出到编译器输出中。现在我有一个工厂:

我想输出传递给的类的大小new(即sizeof( CComObject<Type> )到编译器输出中。看起来#pragma message只接受字符串。

如何输出编译时数字常量?

0 投票
1 回答
234 浏览

c#-4.0 - 如果它具有自定义属性,如何定义对类类型的约束?

如果它具有特定的自定义属性,有什么方法可以强制类实现接口?

如果具有特定属性的类未实现特定接口,我希望出现编译时错误。

如果 myClass 不是 typeof(IMyInterface) ,我会在编译时出错。

谢谢,