小编Kar*_*sen的帖子

ISO C90禁止混合声明和代码...但是在某些情况下允许?

我正在使用以下标志(其中cc是gcc 4.2或clang 8.0):

$ cc -Wall -Werror -pedantic -ansi -std=c89 main.c

(我知道-ansi标志在这种情况下有点多余)

以下给了我预期的错误

main.c:31:8: warning: ISO C90 forbids mixing declarations and code [-Wdeclaration-after-statement]
  vec3 abc = {0};
Run Code Online (Sandbox Code Playgroud)
int main()
{
  vec3 a = {0};
  vec3 b = {0};

  Vec3(2, 2, 2);

  vec3 abc = {0}; // Declared after a function call

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,以下内容不

int main()
{
  vec3 a = Vec3(0, 1, 2);
  vec3 b = Vec3(0, 1, 2);

  vec3 abc = {0}; // Declared after a function call …
Run Code Online (Sandbox Code Playgroud)

c declaration c89 statements

7
推荐指数
2
解决办法
82
查看次数

在C#中实现C ++ / clr的auto_handle功能

我一直在寻找一种方法,以确保在所有情况下(例如在类构造函数末尾的异常)都清除类的成员变量。

因为它们是成员变量,所以“尝试,捕获”和“使用”模式没有用。我注意到.NET C ++(C ++ / clr:safe)提供了对智能指针(称为msclr :: auto_handle)的仿真,例如auto_ptr或shared_ptr。这非常有用,因为我可以非常干净地确定性地破坏有限资源,例如线程或套接字。

我一直在分析用C ++ / clr生成的IL,并注意到它实际上所做的就是在修改封装数据的每个函数中都通过try / faults向IL垃圾邮件。

我已经为有兴趣的人列出了IL清单。(try / fault不是我添加的,而是C ++ / clr编译器添加的)

  MyClass()
  {
        myDisposable.reset(gcnew MyDisposable());
        throw gcnew Exception("Hello World");
        // myDisposable needs to clean up now
        // because it is very large or locks a limited resource.
        // Luckily with RAII.. it does!
  }
Run Code Online (Sandbox Code Playgroud)

...变成...

  .try
  {
  IL_0006:  ldarg.0
  IL_0007:  ldloc.0
  IL_0008:  stfld      class msclr.'auto_handle<MyDisposable>' modreq([mscorlib]System.Runtime.CompilerServices.IsByValue) MyClass::myDisposable
  IL_000d:  ldarg.0
  IL_000e:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0013:  ldarg.0
  IL_0014:  ldfld      class msclr.'auto_handle<MyDisposable>' …
Run Code Online (Sandbox Code Playgroud)

.net c# il raii

0
推荐指数
1
解决办法
727
查看次数

标签 统计

.net ×1

c ×1

c# ×1

c89 ×1

declaration ×1

il ×1

raii ×1

statements ×1