Emit编译指示

emit 编译指示可用于直接影响编译器代码生成器的输出。 因此,它使您的代码无法移植到其他代码生成器/后端。 它的使用非常不鼓励的!但是,它对于与 C++ 或 Objective C 代码非常有用。

示例:

  1. {.emit: """
  2. static int cvariable = 420;
  3. """.}
  4.  
  5. {.push stackTrace:off.}
  6. proc embedsC() =
  7. var nimVar = 89
  8. # 访问字符串文字之外的发送部分中的Nim符号:
  9. {.emit: ["""fprintf(stdout, "%d\n", cvariable + (int)""", nimVar, ");"].}
  10. {.pop.}
  11.  
  12. embedsC()

nimbase.h 定义了 NIM_EXTERNC C宏,它可以用于 extern "C"代码,用于nim cnim cpp ,例如:

  1. proc foobar() {.importc:"$1".}
  2. {.emit: """
  3. #include <stdio.h>
  4. NIM_EXTERNC
  5. void fun(){}
  6. """.}

为了向后兼容,如果emit语句的参数是单个字符串文字,则可以通过反引号引用Nim符号。 但是不推荐使用此用法。

对于顶级emit语句, 生成的C/C++文件中应该发出代码的部分可以通过前缀 /TYPESECTION//VARSECTION//INCLUDESECTION/ 来影响:

  1. {.emit: """/*TYPESECTION*/
  2. struct Vector3 {
  3. public:
  4. Vector3(): x(5) {}
  5. Vector3(float x_): x(x_) {}
  6. float x;
  7. };
  8. """.}
  9.  
  10. type Vector3 {.importcpp: "Vector3", nodecl} = object
  11. x: cfloat
  12.  
  13. proc constructVector3(a: cfloat): Vector3 {.importcpp: "Vector3(@)", nodecl}