我有一个用于在C中实现的编程语言的VM.它支持在32位和64位架构以及C和C++下编译.
我正在尝试使用尽可能多的警告来干净地编译它.当我打开时CLANG_WARN_IMPLICIT_SIGN_CONVERSION
,我会得到一连串的新警告.
我希望有一个很好的策略,可以使用何时使用int
显式无符号类型和/或显式大小的类型.到目前为止,我无法确定该策略应该是什么.
将它们混合使用 - 主要int
用于局部变量和参数之类的东西,并在结构中使用较窄的类型- 确实会导致许多隐式转换问题.
我喜欢为struct字段使用更具体的大小类型,因为我喜欢显式控制堆中对象的内存使用量的想法.此外,对于散列表,我在散列时依赖于无符号溢出,因此如果散列表的大小存储为,则很好uint32_t
.
但是,如果我尝试在任何地方使用更具体的类型,我发现自己到处都是曲折的迷宫.
其他C项目有什么作用?
我的理解是在C#中为泛型指定方差发生在类型声明级别:当您创建泛型类型时,您指定类型参数的方差.另一方面,在Java中,指定了使用泛型的方差:当您创建某个泛型类型的变量时,您可以指定其类型参数的变化方式.
每种选择的优缺点是什么?
在C#中,ref
和out
PARAMS是,据我所知,是,只透过相关值的原始地址通过.该地址可以是指向数组中的元素或对象内的字段的内部指针.
如果发生垃圾收集,则对某个对象的唯一引用可能是通过其中一个内部指针,如:
using System;
public class Foo
{
public int field;
public static void Increment(ref int x) {
System.GC.Collect();
x = x + 1;
Console.WriteLine(x);
}
public static void Main()
{
Increment(ref new Foo().field);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,GC需要找到对象的开头并将整个对象视为可达.它是如何做到的?是否必须扫描整个堆以查找包含该指针的对象?这似乎很慢.
我是一名PHP和ActionScript开发人员,在我的一些函数中,我用return
它来结束它.例:
private function lolsome(a:String):void
{
if(a == "abs"){return void;}
// function's code
}
Run Code Online (Sandbox Code Playgroud)
我可以将函数的代码放入其中else
,但我更喜欢这种方式,因为在我看来,这更加清晰.我只是想知道这是否被认为是一种不好的做法或类似的事情.
谢谢!
我正在编写一个字节码解释器,它可以使用计算的 goto 或switch
主指令调度循环的正常值。关键位包含在几个宏中,这些宏可以定义为使用或不使用计算的 goto。
我想根据编译器是否支持计算 goto 来决定默认使用哪种模式。有谁知道如何确定?据我所知,它们适用于 GCC 和 Clang,但我不想只硬编码几个随机编译器名称。