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

c++ - 使用 constexpr 进行基本编译时格式字符串检查

在我们的项目中,我们使用 printf 兼容函数将消息添加到外部日志文件。例如我们可以写

的函数声明__LOG_INFO如下所示

我们现在想使用 C++ 11 constexpr 功能添加一些简单的编译时格式字符串检查,例如,对格式字符串中的参数数量进行非常简单的检查,我们有这个函数

现在的问题是我们不能在__LOG_INFO函数内部添加类似 static_assert 的东西,因为编译器抱怨 fmt 不是一个整数常量。所以现在我们有这个丑陋的宏解决方案:

因此,与其打电话__LOG_INFO,不如打电话LOG_INFO

除了使用上面的那些宏之外,还有没有更好的解决方案?

0 投票
1 回答
2223 浏览

ios - How to get CFBundleShortVersionString as a constant

I append parts to a constant base URL string in my code as such:

such that the resulting PHP_SCRIPT refers to https://example.com/developer/index.php

I am looking for a way to insert my application's CFBundleShortVersionString into this concatenation. For example, if the CFBundleShortVersionString is 1.12 I want the final URL to be https://example.com/developer/1_12/

I know that the CFBundleShortVersionString can be accessed by

and

but I need help to concatenate it into a constant string.

0 投票
1 回答
744 浏览

c++ - C++ 编译时唯一 ID 生成器总是返回相同的值

我试图创建一个编译时哈希器,它接受一个字符串文字并创建一个整数。我正在使用 Code::Blocks 的 GCC 4.7.1 编译器(之前我已经崩溃了)。这是它的工作原理:

的递归部分my_hash将从字符串的末尾开始,并通过字符串中的字符不断更改数字b,直到遇到基本情况,即返回数字。该宏通过确保变量名称和哈希始终匹配来减少潜在错误的机会。CTH_GEN(A)会评估constexpr unsigned long long A = my_hash<sizeof("A") - 2>("A", basis) 我这样测试它:

这是测试运行的输出:

每边的数字应该相同。左边是哈希的运行时计算,右边是编译时计算。它们都以相同的顺序使用完全相同的数学,但正如您所见,编译时版本总是生成相同的数字。我真的很感激解释,解决方法或全新的方法来解决这个问题。我使用的特定哈希方法完全可以更改,但我认为这完全是一个不同的问题。

0 投票
2 回答
658 浏览

java - Switch 中的静态最终整数:为什么不能这样做?

我在图书馆项目中有一个 Switch 引用来自 R.java 的资源 ID:

从 ADT 14 开始,R 字段不再是最终的,因此 Google 建议将 switch 更改为嵌套 if。很公平。

但是,我想知道为什么这不起作用:

或这个:

他们都抱怨错误“Case statements must be constant expressions”......不是吗,特别是第一个?无论 R.id.xxx 可能是哪个值,我不是将其“最终化”为快照常量吗?

0 投票
3 回答
819 浏览

c++ - 传递带有常量作为参数的模板类

我的模板类如下所示:

如此简单明了,模板参数决定了矩阵的大小。大小在逻辑上是恒定的,所以我实现它是恒定的。但是当我尝试编写一个接受 my 的函数时matrix,我遇到了以下问题:

这样写,编译器理所当然地反对缺少模板参数......但是

触发此错误:error: expected a constant of type 'unsigned int', got 'unsigned> int'

这也是正确的,因为matrix需要常量,而不是类型。

如何处理?我确定我不是第一个遇到这个问题的人,解决传递常量参数化模板这个问题的最“规范”方法是什么?

0 投票
1 回答
1785 浏览

c++ - C++11 之前的“常量表达式”

constexpr关键字是在 C++11 中引入的,因为(我认为)是“常量表达式”的相应概念。然而,这个概念隐含在 C++98/c++03 中,因为数组声明需要一个常量表达式:

还有其他“常量表达式”,即可以(和/或必须)在编译时评估的表达式;一个例子是模板参数。

对于 C++11 之前的版本,C++98/03 标准或其他地方是否存在以下内容?

  • 需要常量表达式的语法结构的完整列表(例如数组声明和模板实例化)
  • 管理此类常量表达式的规则(大概这只是从上面列表中的项目到标准中的定义的映射)
0 投票
1 回答
205 浏览

actionscript-3 - 错误 1046:找不到类型或不是编译时常量:程序

我正在尝试将我的 .as 文件链接到我的 Flash 程序。以下是我的 .as 文件中的代码:

以下是我的 Flash 文件中的代码:

有人可以告诉我我做错了什么吗?我不断收到错误 1046!谢谢!:)

0 投票
2 回答
83 浏览

c++ - 使用旧的 C++ 实现在编译时检查一些编译时定义

在处理大型遗留代码库时,我今天怀疑重复定义,但这种依赖对我人类来说并不明显,因为它依赖于大量编译时计算。

当我让编译器说话时,我想起了一些类似sizeof问题的案例。

我通常在代码中(在 IDE 中)放一些像这样的临时公式,然后按 [Alt]+[F9]:

...这只是因为我的编译器(Borland C++ 5.6.4)惰性评估了typedef具有非文字维度的 for 数组:

像这样的检查有没有一种非常容易记忆的方法?而且,请不要责怪一个勇敢的老编译器;-)

0 投票
6 回答
95738 浏览

c++ - M_PI 标记为未声明的标识符

当我编译下面的代码时,我收到了这些错误消息:

这是什么?

0 投票
1 回答
632 浏览

c# - 为什么默认方法参数必须是 C# 中的编译时常量

编辑 1:我知道有诸如伸缩之类的替代方案,这是一个纯粹的教育问题。

我知道这是真的,但为什么一定要这样呢?看起来像这样:

编译器可以将方法更改为如下所示:

为什么那行不通,或者行不通,而这只是一个设计决定?