• Emit编译指示

    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}