问题标签 [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.
java - 在编译时未评估的接口中定义的最终静态字符串 - Android
我有两个类和一个接口(例如DatabaseModel
、LocalStore
和 InternalModelInterface)。它们的定义如下;
我遇到的问题是,在运行时,当我调用时localStore.function()
, temp 被分配为 null,就像InternalModelInterface.COLUMN_PARAM1
null 一样。这有意义吗?不InternalModelInterface.COLUMN_PARAM1
应该在编译时评估和内联吗?
这适用于 Android 应用程序。提前致谢。
我将进一步解释以澄清任何混淆。
类的对象在DatabaseModel
解析 JSON 响应时被实例化。类中定义的常量DatabaseModel
表示要在 JSON 响应中查找的键。
定义设备上本地(缓存)数据库中使用的InternalModelInterface
列名。由于几个原因(包括它们的键是 SQLite 中的非法列名),我没有将键重用为列名。
我使用接口而不只是普通类的原因是接口还指定了需要由第三个类 LocalStore 实现的所需方法。
c - 即使 L 后缀,C 中的十六进制常数也是无符号的
我知道这是一个简单的问题,但我很困惑。我有一个相当典型的 gcc 警告,通常很容易修复:
warning: comparison between signed and unsigned integer expressions
每当我有一个具有最高有效位的十六进制常量时,例如 0x80000000L,编译器会将其解释为无符号。例如,使用 -Wextra 编译此代码将导致警告 (gcc 4.4x, 4.5x):
我已经专门为常量加上了后缀,那么为什么会发生这种情况呢?
c# - C# - 为什么 DateTime.MinValue 和 MaxValue 不是编译时常量?
我想要一个方法的可选日期参数(默认为 MinValue),以检查用户是否实际提供了一个值(提供 MinValue 无效),但我不允许,因为它显然不是编译-时间常数。
根据MSDN 页面,“该常量的值相当于 0001 年 1 月 1 日的 00:00:00.0000000。”
那么为什么这不是编译时常量呢?为什么它与传入允许的 Int32.MinValue 不同?
objective-c - Objective-c 常量静态 NSArray
我是一名 Java 程序员,正在学习 Objective-C,但我在变量的实现方面遇到了问题,类似于 Java 中的静态最终类变量。在 PolygonShape 类中,我希望 NSDictionary 具有多边形类型,可以从类内部和外部访问。我已经尝试了以下方法:
多边形形状.h:
多边形形状.m:
但这还不够好,因为如果我想在不初始化 PolygonShape 实例的情况下从其他地方(例如 main.m)访问多边形类型,则变量 polygonTypes 为 nil。所以我使用了工作正常的静态函数:
多边形形状.m:
现在这没问题,但我想知道,最好的方法是什么,是否可以将 extern 用于 NSDictionary 而不必在类方法中初始化它?(而且我知道单例类,但我真的很想在 PolygonShape 类中有一个常量的多边形类型数组)。
c++ - AVR / Linux GCC C++ 项目的通用常量
我正在为 Linux + AVR Arduino 项目创建软件。显然,整个工作在 Eclipse 中分为几个项目(我没有使用 Arduino IDE)。我想为所有这些项目使用常见的,主要是字符串的常量。我还必须腾出微控制器的 RAM,因此需要编译时常量。我如何最好地实施它?我的想法是为这些常量创建一个单独的、仅包含标题的项目。
使用:
还不够好,因为我希望能够像这样连接字符串常量:
我也不想用define
。我想使用:
它允许字符串连接并且是(AFAIK)编译时,但 std::string 在 avr 项目中不可用 - 或者我在这里错了,只是不知道如何使用它。
任何帮助表示赞赏。
assembly - NASM 中的 equ 和 db 有什么区别?
它们是否相同,产生一个可以用来代替的标签2
?如果不是,那么每个申报表的优点或缺点是什么?它们可以互换使用吗?
clojure - Clojure 编译时常量
这个问题纯粹来自“精神主宰”,大概没有实用价值。
如果我在 Clojure 中使用 定义一个值def
,是否可以诱导编译器在编译时评估它,而不是等到运行时?
我想我可以定义一个宏,但是调用语法变得有点尴尬:
这也有效,但仍然很难看:
我也理解(或相信)Clojure 在编译时计算常量表达式:
我只是在学习 Common Lisp,但我的理解是 Common Lisp 支持用户定义的阅读器宏,因此您可以定义一个阅读器宏(类似于#$
),在编译时评估以下符号:
顺便说一句,这种语法并不比宏调用“漂亮”。
如何让 Clojure 在编译时评估常量变量并将引用替换为实际值?它已经这样做了吗?
在有人开始引用 Knuth 定律(“过早优化是万恶之源”)之前,我问这个问题是为了更好地理解 Clojure 编译的内部结构。
c++ - 如何在类的头文件中定义 const double?
在我的类的头文件中,我正在尝试以下内容并收到编译器投诉:
你应该如何真正做到这一点?
c++ - 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
。假设我enum
从0
to 开始,最直接的方法是创建一个大小为结果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++ 在如此不同的时间内运行?
如果我fib
用constexpr
参数调用,我不能比编译器完全优化函数调用做得更好。但是,如果我fib
使用非constexpr
参数调用,我可能希望它调用我自己的版本,该版本实现了诸如 memoization 之类的东西(这将需要状态),所以我得到的运行时间类似于我传递constexpr
参数时的编译时间.
java - 编译时常量和变量
Java 语言文档说:
如果原始类型或字符串被定义为常量并且值在编译时已知,则编译器将代码中任何地方的常量名称替换为其值。这称为编译时常量。
我的理解是如果我们有一段代码:
然后,编译器会将x
代码中出现的每一个 替换为 literal 10
。
但是假设常量在运行时被初始化:
与编译时常数相比,是否会有任何性能下降(无论它可以忽略不计)?
另一个问题是以下代码行是否:
被编译器以与编译时常量相同的方式处理?
最后,我从答案中了解到的是:
final static
表示编译时常数- 只是
final
意味着它是一个常数,但在运行时初始化 - 只是
static
意味着在运行时初始化 - without
final
是一个变量,不会被视为常量。
我的理解正确吗?