问题标签 [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 投票
2 回答
1537 浏览

java - 在编译时未评估的接口中定义的最终静态字符串 - Android

我有两个类和一个接口(例如DatabaseModelLocalStore和 InternalModelInterface)。它们的定义如下;

我遇到的问题是,在运行时,当我调用时localStore.function(), temp 被分配为 null,就像InternalModelInterface.COLUMN_PARAM1null 一样。这有意义吗?不InternalModelInterface.COLUMN_PARAM1应该在编译时评估和内联吗?

这适用于 Android 应用程序。提前致谢。

我将进一步解释以澄清任何混淆。

类的对象在DatabaseModel解析 JSON 响应时被实例化。类中定义的常量DatabaseModel表示要在 JSON 响应中查找的键。

定义设备上本地(缓存)数据库中使用的InternalModelInterface列名。由于几个原因(包括它们的键是 SQLite 中的非法列名),我没有将键重用为列名。

我使用接口而不只是普通类的原因是接口还指定了需要由第三个类 LocalStore 实现的所需方法。

0 投票
5 回答
5537 浏览

c - 即使 L 后缀,C 中的十六进制常数也是无符号的

我知道这是一个简单的问题,但我很困惑。我有一个相当典型的 gcc 警告,通常很容易修复:
warning: comparison between signed and unsigned integer expressions

每当我有一个具有最高有效位的十六进制常量时,例如 0x80000000L,编译器会将其解释为无符号。例如,使用 -Wextra 编译此代码将导致警告 (gcc 4.4x, 4.5x):

我已经专门为常量加上了后缀,那么为什么会发生这种情况呢?

0 投票
2 回答
5620 浏览

c# - C# - 为什么 DateTime.MinValue 和 MaxValue 不是编译时常量?

我想要一个方法的可选日期参数(默认为 MinValue),以检查用户是否实际提供了一个值(提供 MinValue 无效),但我不允许,因为它显然不是编译-时间常数。

根据MSDN 页面,“该常量的值相当于 0001 年 1 月 1 日的 00:00:00.0000000。”

那么为什么这不是编译时常量呢?为什么它与传入允许的 Int32.MinValue 不同?

0 投票
1 回答
2297 浏览

objective-c - Objective-c 常量静态 NSArray

我是一名 Java 程序员,正在学习 Objective-C,但我在变量的实现方面遇到了问题,类似于 Java 中的静态最终类变量。在 PolygonShape 类中,我希望 NSDictionary 具有多边形类型,可以从类内部和外部访问。我已经尝试了以下方法:

多边形形状.h:

多边形形状.m:

但这还不够好,因为如果我想在不初始化 PolygonShape 实例的情况下从其他地方(例如 main.m)访问多边形类型,则变量 polygonTypes 为 nil。所以我使用了工作正常的静态函数:

多边形形状.m:

现在这没问题,但我想知道,最好的方法是什么,是否可以将 extern 用于 NSDictionary 而不必在类方法中初始化它?(而且我知道单例类,但我真的很想在 PolygonShape 类中有一个常量的多边形类型数组)。

0 投票
2 回答
962 浏览

c++ - AVR / Linux GCC C++ 项目的通用常量

我正在为 Linux + AVR Arduino 项目创建软件。显然,整个工作在 Eclipse 中分为几个项目(我没有使用 Arduino IDE)。我想为所有这些项目使用常见的,主要是字符串的常量。我还必须腾出微控制器的 RAM,因此需要编译时常量。我如何最好地实施它?我的想法是为这些常量创建一个单独的、仅包含标题的项目。

使用:

还不够好,因为我希望能够像这样连接字符串常量:

我也不想用define。我想使用:

它允许字符串连接并且是(AFAIK)编译时,但 std::string 在 avr 项目中不可用 - 或者我在这里错了,只是不知道如何使用它。

任何帮助表示赞赏。

0 投票
3 回答
20195 浏览

assembly - NASM 中的 equ 和 db 有什么区别?

它们是否相同,产生一个可以用来代替的标签2?如果不是,那么每个申报表的优点或缺点是什么?它们可以互换使用吗?

0 投票
3 回答
1423 浏览

clojure - Clojure 编译时常量

这个问题纯粹来自“精神主宰”,大概没有实用价值。

如果我在 Clojure 中使用 定义一个值def,是否可以诱导编译器在编译时评估它,而不是等到运行时?

我想我可以定义一个宏,但是调用语法变得有点尴尬:

这也有效,但仍然很难看:

我也理解(或相信)Clojure 在编译时计算常量表达式:

我只是在学习 Common Lisp,但我的理解是 Common Lisp 支持用户定义的阅读器宏,因此您可以定义一个阅读器宏(类似于#$),在编译时评估以下符号:

顺便说一句,这种语法并不比宏调用“漂亮”。

如何让 Clojure 在编译时评估常量变量并将引用替换为实际值?它已经这样做了吗?

在有人开始引用 Knuth 定律(“过早优化是万恶之源”)之前,我问这个问题是为了更好地理解 Clojure 编译的内部结构。

0 投票
3 回答
11750 浏览

c++ - 如何在类的头文件中定义 const double?

在我的类的头文件中,我正在尝试以下内容并收到编译器投诉:

你应该如何真正做到这一点?

0 投票
8 回答
12614 浏览

c++ - constexpr 重载

相关:返回 constexpr 的函数无法编译

我觉得 constexpr 在 C++11 中的用处有限,因为无法定义两个函数,否则它们将具有相同的签名,但一个是 constexpr,另一个不是 constexpr。换句话说,如果我可以拥有一个仅接受 constexpr 参数的 constexpr std::string 构造函数,以及一个用于非 constexpr 参数的非 constexpr std::string 构造函数,那将非常有帮助。另一个例子是理论上复杂的函数,可以通过使用状态来提高效率。你不能用 constexpr 函数轻易做到这一点,所以你有两个选择:如果你传入非 constexpr 参数,则有一个非常慢的 constexpr 函数,或者完全放弃 constexpr (或编写两个单独的函数,但您可能不知道要调用哪个版本)。

因此,我的问题是:

符合标准的 C++11 实现是否有可能允许基于 constexpr 的参数进行函数重载,或者这是否需要更新标准?如果不允许,是不是故意不允许的?


@NicolBolas:假设我有一个将 an 映射enum到 a的函数std::string。假设我enum0to 开始,最直接的方法是创建一个大小为结果n - 1的数组。n

我可以创建一个static constexpr char const * []并在返回时构造一个std::string(支付std::string每次调用函数时创建对象的成本),或者我可以创建一个static std::string const []并返回我查找的值,在std::string我第一次支付所有构造函数的成本调用函数。似乎更好的解决方案是std::string在编译时创建内存中(类似于现在使用 所做的char const *),但这样做的唯一方法是提醒构造函数它有constexpr参数。

对于构造函数以外的示例std::string,我认为找到一个示例非常简单,如果您可以忽略constexpr(并因此创建非constexpr函数)的要求,则可以创建更有效的函数。考虑这个线程:constexpr 问题,为什么这两个不同的程序使用 g++ 在如此不同的时间内运行?

如果我fibconstexpr参数调用,我不能比编译器完全优化函数调用做得更好。但是,如果我fib使用非constexpr参数调用,我可能希望它调用我自己的版本,该版本实现了诸如 memoization 之类的东西(这将需要状态),所以我得到的运行时间类似于我传递constexpr参数时的编译时间.

0 投票
8 回答
42699 浏览

java - 编译时常量和变量

Java 语言文档说:

如果原始类型或字符串被定义为常量并且值在编译时已知,则编译器将代码中任何地方的常量名称替换为其值。这称为编译时常量。

我的理解是如果我们有一段代码:

然后,编译器会将x代码中出现的每一个 替换为 literal 10


但是假设常量在运行时被初始化:

与编译时常数相比,是否会有任何性能下降(无论它可以忽略不计)?


另一个问题是以下代码行是否:

被编译器以与编译时常量相同的方式处理?


最后,我从答案中了解到的是:

  1. final static表示编译时常数
  2. 只是final意味着它是一个常数,但在运行时初始化
  3. 只是static意味着在运行时初始化
  4. withoutfinal是一个变量,不会被视为常量。

我的理解正确吗?