Emit 编译指示
emit 编译指示可以直接影响编译器代码生成器的输出。这样一来,代码将无法移植到其他代码生成器/后端,非常不鼓励使用这种方法。然而,它对于实现与 C++ 或 Objective C 代码的接口非常有用。
示例:
{.emit: """
static int cvariable = 420;
""".}
{.push stackTrace:off.}
proc embedsC() =
var nimVar = 89
# 在 emit 内、字符串字面值以外访问 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(){}
""".}
Note: 为了向后兼容,如果 emit 语句的参数是单一的字符串字面值,可以通过反引号引用 Nim 标识符。但这种用法已经废弃。
顶层 emit 语句所输出的代码混杂在所生成的 C/C++ 文件中,其位置可通过前缀 /*TYPESECTION*/:c:、/*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}
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .