我正在将一些C代码移植到Rust,该代码包含很多这样的东西:
#define CONFIG_FLAG_NUMBER_23 1
#define THIS 10
#define THAT 11
#define THIS_AND_THAT (THIS + THAT)
#if CONFIG_FLAG_NUMBER_23
#define THIS_OR_THAT THIS
#else
#define THIS_OR_THAT THAT
#endif
#define ROOT_DIR "/root"
#define FILE_ONE ROOT_DIR "/file_one"
#define FILE_TWO ROOT_DIR "/file_two"
Run Code Online (Sandbox Code Playgroud)
我决定删除宏并用常量表达式替换它们,但是在Rust中尝试这样做并不是很成功:
static CONFIG_FLAG: bool = true;
static THIS: int = 10;
static THAT: int = 11;
static THIS_AND_THAT: int = THIS + THAT; // Okay, it works
// 1: Conditions
static THIS_OR_THAT: int = CONFIG_FLAG ? THIS : THAT; // Doesn't work, no conditional …Run Code Online (Sandbox Code Playgroud) Rust中有哪些规则,类似于规则,在此处描述了http://en.cppreference.com/w/cpp/language/eval_order for C++?
现在我从经验上发现,
1)函数的参数按直接顺序进行评估
2)所有带副作用的内置操作(=,+ =, - =等)返回单位,因此很难(但可能)编写表达式,在C++中显示UB.
一个例子:
let mut a = 1i;
let b = 2i;
let c = 3i;
let d = (a = b) == (a = c); // What is a? (a is actually 3)
Run Code Online (Sandbox Code Playgroud)
3)似乎函数调用按照C++中的顺序进行排序
4)似乎内置操作被排序,就好像它们是函数(方法)调用一样,即评估顺序与运算符优先级相关联
我的结论是否正确?什么是确切的评估模型?
假设我希望我的可执行文件被命名为“index.cgi”(或任何其他不是正确的 Rust crate 名称的名称)并使用 Cargo 构建。
Cargo 中是否有任何方法可以指定输出可执行文件的名称,或者在构建后步骤中重命名可执行文件?Cargo 的文档非常稀缺,我在那里找不到任何东西。(对来源的简要介绍也没有太大帮助。)
从参考手册中可以清楚地看出,structs的内存布局未指定(直到使用该repr属性).此规则为编译器提供了通过重新排序字段来更紧密地打包结构的可能性.
元组和元组结构的内存布局怎么样?
它是如何(未)指定的,为什么?