Emit编译指示
emit 编译指示可用于直接影响编译器代码生成器的输出。 因此,它使您的代码无法移植到其他代码生成器/后端。 它的使用非常不鼓励的!但是,它对于与 C++ 或 Objective C 代码非常有用。
示例:
- {.emit: """
- static int cvariable = 420;
- """.}
- {.push stackTrace:off.}
- proc embedsC() =
- var nimVar = 89
- # 访问字符串文字之外的发送部分中的Nim符号:
- {.emit: ["""fprintf(stdout, "%d\n", cvariable + (int)""", nimVar, ");"].}
- {.pop.}
- embedsC()
nimbase.h 定义了 NIM_EXTERNC C宏,它可以用于 extern "C"代码,用于
nim c 和 nim cpp ,例如:
- proc foobar() {.importc:"$1".}
- {.emit: """
- #include <stdio.h>
- NIM_EXTERNC
- void fun(){}
- """.}
为了向后兼容,如果emit
语句的参数是单个字符串文字,则可以通过反引号引用Nim符号。 但是不推荐使用此用法。
对于顶级emit语句, 生成的C/C++文件中应该发出代码的部分可以通过前缀 /TYPESECTION/ 或 /VARSECTION/ 或 /INCLUDESECTION/ 来影响:
- {.emit: """/*TYPESECTION*/
- struct Vector3 {
- public:
- Vector3(): x(5) {}
- Vector3(float x_): x(x_) {}
- float x;
- };
- """.}
- type Vector3 {.importcpp: "Vector3", nodecl} = object
- x: cfloat
- proc constructVector3(a: cfloat): Vector3 {.importcpp: "Vector3(@)", nodecl}