我正在编写一个c ++库,它公开了一些仅由C#代码使用的函数.但是,由于我意外地错误输入了参数,我发现只要我不在cpp文件中使用(没有错误的版本)函数,即使没有任何警告,也可以成功编译和链接此代码.
struct Dummy { int a; double b; };
extern "C" void SetArray(Dummy* x, int cnt);
void SetArray(Dummy x, int cnt)
{
// a TODO placeholder.
}
Run Code Online (Sandbox Code Playgroud)
如何让编译器为这种情况抛出错误或警告?编译器选项-Wall已设置但仍然没有警告.使用tdmgcc 5.1.0.
我试过多次这样编码:
struct Foo
{
double const& f;
Foo(double const& fx) : f(fx)
{
printf("%f %f\n", fx, this->f); // 125 125
}
double GetF() const
{
return f;
}
};
int main()
{
Foo p(123.0 + 2.0);
printf("%f\n", p.GetF()); // 0
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它根本不会崩溃。我还使用valgrind来测试程序,但没有出现错误或警告。所以,我假设编译器自动生成了一个代码,将引用指向另一个隐藏变量。但我真的不确定。
我有一个结构,所有存储只读引用,例如:
struct Pt { x : f32, y : f32, }
struct Tr<'a> { a : &'a Pt }
Run Code Online (Sandbox Code Playgroud)
我想impl Eq对于Tr测试,如果下伏a参考如出一辙Pt:
let trBase1 = Pt::new(0.0, 0.0);
let trBase2 = Pt::new(0.0, 0.0);
assert!(trBase1 == trBase2); // ok.
let tr1 = Tr::new(&trBase1);
let tr2 = Tr::new(&trBase2);
let tr3 = Tr::new(&trBase1);
assert!(tr1 == tr3); // ok.
assert!(tr1.a == te2.a); // ok. Using Eq for Pt that compare values.
assert!(tr1 != tr2); // panicked! Not intended. …Run Code Online (Sandbox Code Playgroud) c++ ×2
borrowing ×1
compilation ×1
constants ×1
extern ×1
lifetime ×1
overloading ×1
reference ×1
rust ×1
temporary ×1