标签: const

如何在F#中定义类型成员常量?

在C#中,可以像这样定义一个类型成员常量:

class Foo { public const int Bar = 600; }
Run Code Online (Sandbox Code Playgroud)

IL看起来像这样.

.field public static literal int32 Bar = int32(600)
Run Code Online (Sandbox Code Playgroud)

我如何在Visual F#/ FSharp中做同样的事情?

我试过这个无济于事:

[<Sealed>]
 type Foo() =

    [<Literal>]
    let Bar = 600
Run Code Online (Sandbox Code Playgroud)

.net f# const

19
推荐指数
2
解决办法
4813
查看次数

C中的Static,define和const

我已经读过,当每次调用函数时不希望变量值改变/初始化时,静态变量在函数内部使用.但是如何在"main"之前在主程序中定义变量static,例如

#include <stdio.h>

static double m = 30000;

int main(void)
{
value = m * 2 + 3;
}
Run Code Online (Sandbox Code Playgroud)

这里变量m具有一个常量值,以后不会在主程序中修改.在同样的思路中,它有什么不同,而不是使用静态定义:

const double m = 30000;
Run Code Online (Sandbox Code Playgroud)

要么

#define m 30000  //m or M  
Run Code Online (Sandbox Code Playgroud)

然后确保在主代码中使用双重操作,以便将m转换为正确的数据类型.

c static const c-preprocessor

19
推荐指数
4
解决办法
2万
查看次数

C#"常量对象"用作默认参数

有没有办法创建一个常量对象(即它无法编辑并在编译时创建)?

我只是在玩C#语言并注意到可选参数功能,并认为可以将默认对象用作可选参数.考虑以下:

//this class has default settings
private const SettingsClass DefaultSettings = new SettingsClass ();

public void doSomething(SettingsClass settings = DefaultSettings)
{

}
Run Code Online (Sandbox Code Playgroud)

这显然不能编译,但是我想做的一个例子.是否可以创建这样的常量对象并将其用作可选参数的默认值?

c# const optional-parameters

19
推荐指数
2
解决办法
1万
查看次数

我是否正确地说const_cast后面的ref-to-const绑定到临时修改是好的?

我想检查一下我对此事的理解和结论.


在IRC上,有人问:

绑定到临时对象const_castconst引用是否可以接受?

翻译:他有一个临时的ref-to-const,他想抛弃它const来修改它.

我的回答是我之前曾问过一个类似的问题,其中的共识似乎是临时性本身并不是天生的const,因此你可以抛弃const你对它们的引用的性质,并通过结果修改它们.而且,只要原始参考const仍然存在,这不会影响临时的生命周期.

那是:

int main()
{
   const int& x = int(3);

   int& y = const_cast<int&>(x);
   y = 4;

   cout << x;
}
// Output: 4
// ^ Legal and safe
Run Code Online (Sandbox Code Playgroud)

我对吗?


(当然,这些代码是否真的是可取的完全是另一回事!)

c++ const reference const-cast temporary-objects

19
推荐指数
1
解决办法
526
查看次数

const变量是否放在只读内存中?

或者是否有一些其他保护措施不能修改它们?

如果它们在只读存储器中是有意义的 - 这就是制作它们的原因const,对吗?

c c++ const

19
推荐指数
3
解决办法
6801
查看次数

多个const限定符的含义是什么?

码:

const char* const* const* foo(int bar);
Run Code Online (Sandbox Code Playgroud)

我已经看过双锥体,之前也阻止了指针的修改.我第一次见到生命中的三重常数.想知道它的用途是什么.

c const declaration function-signature

19
推荐指数
3
解决办法
989
查看次数

C中数组的const和typedef

在C中,typedef使用这种结构可以使用数组:

typedef int table_t[N];

这里,table_t现在定义为N的数组int.声明的任何变量table_t t;现在将表现为正常数组int.

这种构造的要点是在函数中用作参数类型,例如:

int doSomething(table_t t);

一个相对等效的函数原型可能是:

int doSomething(int* t);

第一个结构的优点是它强制执行N表的大小.在许多情况下,强制执行此属性更安全,而不是依赖程序员来正确地找出这种情况.

现在一切都很好,除了为了保证表的内容不会被修改,有必要使用const限定符.

以下陈述相对简单易懂:

int doSomething(const int* t);

现在,doSomething保证它不会修改作为指针传递的表的内容.现在,这几乎相同的建筑怎么样?:

int doSomething(const table_t t);

这是什么const?表的内容,或指向表的指针?如果它是指针const,是否有另一种方式(C90兼容)保留定义表大小的能力并告诉它的内容将是const?

请注意,有时还需要修改表的内容,因此该const属性不能嵌入到typedef定义中.

[ 编辑 ]感谢到目前为止收到的优秀答案.总结一下:

  • typedef强制执行大小N的初始假设是完全错误的.它基本上与普通指针的行为相同.
  • const属性的行为也与指针相同(与指针类型的typedef形成鲜明对比,如下面的@random所示)
  • 要强制执行一个大小(这不是最初的问题,但最终现在非常重要......),请参阅Jonathan的回答

c arrays typedef const

19
推荐指数
3
解决办法
4464
查看次数

jslint --edition =最新的意外ES6功能.常量

我正在尝试使用node-jslint https://github.com/reid/node-jslint以保持我的代码清洁

我的nodejs脚本中有一个const,但是jslint说它不是有效的ES6代码

 Unexpected ES6 feature.
const pdPersonsFilterId = process.argv[2]; // Line 10, Pos 0
Run Code Online (Sandbox Code Playgroud)

这是我在控制台中使用的命令

jslint --edition=latest index.js
Run Code Online (Sandbox Code Playgroud)

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const,可以使用全局常量.

为什么jslint不认为此代码有效?

javascript const jslint node.js ecmascript-6

19
推荐指数
2
解决办法
2万
查看次数

无法在Typescript中导出常量

有谁可以帮助我吗

我有2个文件main.ts和hi.ts

hi.ts:

export const hello = "dd";
Run Code Online (Sandbox Code Playgroud)

main.ts:

import { hello } from "./hi";
...
class A {
    public sayHello() {
        console.log("hello=" + hello);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我有例外:

未捕获的ReferenceError:未定义hello(...)

如何从A类中看到这个const变量?可能吗?

import export const typescript

19
推荐指数
1
解决办法
3万
查看次数

使用结构化绑定标记为const的变量不是const

我一直在编写一组类来允许一个简单的类似python的zip函数.以下代码片段(几乎)可以正常工作.然而,这两个变量ab没有const.

std::vector<double> v1{0.0, 1.1, 2.2, 3.3};
std::vector<int> v2{0, 1, 2};

for (auto const& [a, b] : zip(v1, v2))
{
    std::cout << a << '\t' << b << std::endl;
    a = 3; // I expected this to give a compiler error, but it does not
    std::cout << a << '\t' << b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我一直在使用gcc 7.3.0.这是MCVE:

#include <iostream>
#include <tuple>
#include <vector>

template <class ... Ts>
class zip_iterator
{
    using value_iterator_type = …
Run Code Online (Sandbox Code Playgroud)

c++ const c++17 structured-bindings

19
推荐指数
1
解决办法
939
查看次数