代码之家  ›  专栏  ›  技术社区  ›  Tyzoid 5gon12eder

Visual Studio 2015:Extern“C”和“export”关键字

  •  1
  • Tyzoid 5gon12eder  · 技术社区  · 7 年前

    主.cpp

    extern "C" {
        #include "cheader.h"
    }
    
    int main()
    {
        printfFromC();
        return 0;
    }
    

    切德尔·h

    #ifndef HEADER_H
    #define HEADER_H
    
    extern int export;
    int printfFromC();
    
    #endif
    

    测试c

    #include "cheader.h"
    #include <stdio.h>
    
    int export = 0;
    
    int printfFromC()
    {
        export++;
        return printf("Hello from C (invocation %d) !\n", export);
    }
    

    出现以下错误:

    ------ Build started: Project: ConsoleApplication1, Configuration: Debug Win32 ------
      main.cpp
    c:\[...]\cheader.h(4): warning C4091: 'extern ': ignored on left of 'int' when no variable is declared
    c:\[...]\cheader.h(4): error C2143: syntax error: missing ';' before 'export'
    c:\[...]\cheader.h(4): error C3378: a declaration can be exported only from a module interface unit
    

    编辑:

    我在创建示例时犯了一个错误-导致问题的关键字是 export -不是我第一次想到的任何c++保留关键字。下面的示例已修改为 int export int new

    3 回复  |  直到 7 年前
        1
  •  6
  •   user2100815 user2100815    7 年前

    使用 extern "C" 控制应用它的代码的名称混乱-它不会神奇地使编译器将代码编译为C #include 包含 extern int export; 在里面 main.cpp export 是C++中的保留字,会导致语法错误。

        2
  •  3
  •   AnT stands with Russia    7 年前

    new 是C++中的关键字。在交叉编译的代码中不能将其用作标识符。这就是错误的原因。你必须给变量起一个不同的名字。

    请注意,将C++翻译单元的一部分放入 extern "C" { ... }

        3
  •  -1
  •   Tyzoid 5gon12eder    7 年前

    进一步挖掘,这里的黑客建议似乎奏效了: https://stackoverflow.com/a/36869181/1486100

    改变主.cpp以下面的方式允许它编译。

    extern "C" {
        #include "cheader.h"
    }
    
    int main()
    {
        printfFromC();
        return 0;
    }
    

    extern "C" {
        #define export extern_export
        #include "cheader.h"
        #undef export
    }
    
    int main()
    {
        printfFromC();
        return 0;
    }