cython

Форк
0
/
cpp_extern.srctree 
171 строка · 3.5 Кб
1
# mode: run
2
# tag: cpp
3
# ticket: 1839
4

5
"""
6
PYTHON setup.py build_ext --inplace
7
PYTHON -c "from include_as_c_and_cpp import test; test()"
8
PYTHON -c "from include_from_c_and_cpp import test; test()"
9
PYTHON -c "from cdefines import test; test()"
10
"""
11

12
######## setup.py ########
13

14
from Cython.Build import cythonize
15
from Cython.Distutils.extension import Extension
16
from distutils.core import setup
17
import sys
18

19
include_as_c_and_cpp = Extension(
20
    "include_as_c_and_cpp",
21
    ["include_as_c_and_cpp.pyx", "include_as_c.cpp", "include_as_cpp.cpp"],
22
)
23
include_from_c_and_cpp = Extension(
24
    "include_from_c_and_cpp",
25
    ["include_from_c_and_cpp.pyx", "include_from_c.c", "include_from_cpp.cpp"],
26
)
27

28
cdefines = Extension(
29
    "cdefines",
30
    ["cdefines.pyx", "cdefines_clean.c", "cdefines_plain.cpp"],
31
    define_macros = [("CYTHON_EXTERN_C", 'extern "C"')],
32
)
33

34
ext_modules = [include_as_c_and_cpp, include_from_c_and_cpp]
35
if sys.platform != "win32":
36
    # It's very hard to get the command-line macro define to escape properly on Windows,
37
    # so skip it
38
    ext_modules.append(cdefines)
39

40
setup(
41
    ext_modules=cythonize(ext_modules),
42
)
43

44

45
######## include_as_c_and_cpp.pyx ########
46

47
# distutils: language = c++
48

49
from libcpp cimport vector
50

51
cdef public vector.vector[int] get_vector():
52
    return [1,2,3]
53

54
cdef extern from "include_as_c_and_cpp_header.h":
55
    cdef size_t size_vector1()
56
    cdef size_t size_vector2()
57

58
def test():
59
    assert size_vector1() == 3
60
    assert size_vector2() == 3
61

62
######## include_as_c_and_cpp_header.h ########
63

64
size_t size_vector1();
65
size_t size_vector2();
66

67
######## include_as_cpp.cpp ########
68

69
#include <vector>
70
#include "include_as_c_and_cpp.h"
71

72
size_t size_vector1() {
73
    return get_vector().size();
74
}
75

76
######## include_as_c.cpp ########
77

78
#include <vector>
79
extern "C" {
80
// #include within `extern "C"` is legal.
81
// We want to make sure here that Cython C++ functions are flagged as `extern "C++"`.
82
// Otherwise they would be interpreted with C-linkage if the header is include within a `extern "C"` block.
83
#include "include_as_c_and_cpp.h"
84
}
85

86
size_t size_vector2() {
87
    return get_vector().size();
88
}
89

90

91
######## include_from_c_and_cpp.pyx ########
92

93
cdef public char get_char():
94
    return 42
95

96
cdef extern from "include_from_c_and_cpp_header.h":
97
    cdef int get_int1()
98
    cdef int get_int2()
99

100
def test():
101
    assert get_int1() == 42
102
    assert get_int2() == 42
103

104
######## include_from_c_and_cpp_header.h ########
105

106
int get_int1();
107
int get_int2();
108

109
######## include_from_c.c ########
110

111
#include "include_from_c_and_cpp.h"
112

113
int get_int1() { return (int)get_char(); }
114

115
######## include_from_cpp.cpp ########
116

117
extern "C" {
118
#include "include_from_c_and_cpp.h"
119
}
120

121
extern "C" int get_int2() { return (int)get_char(); }
122

123

124
######## cdefines.pyx ########
125

126
# distutils: language = c++
127

128
cdef public char get_char():
129
    return 42
130

131
cdef extern from "cdefines_header.h":
132
    cdef int get_int1()
133
    cdef int get_int2()
134

135
def test():
136
    assert get_int1() == 42
137
    assert get_int2() == 42
138

139
######## cdefines_header.h ########
140

141
#ifdef __cplusplus
142
  #define cdefines_EXTERN_C extern "C"
143
#else
144
  #define cdefines_EXTERN_C
145
#endif
146

147
cdefines_EXTERN_C int get_int1();
148
int get_int2();
149

150
######## cdefines_clean.c ########
151

152
#undef CYTHON_EXTERN_C
153
#define CYTHON_EXTERN_C
154
#include "cdefines.h"
155

156
int get_int1() { return (int)get_char(); }
157

158
######## cdefines_plain.cpp ########
159

160
#include "cdefines.h"
161

162
int get_int2() { return (int)get_char(); }
163

164
######## cdefines.py ##########
165

166
# Dummy module so Windows test works
167
import sys
168
assert sys.platform == "win32"
169

170
def test():
171
    pass
172

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.