Когда я включил библиотеку программного обеспечения, написанную на C, в существующий демонстрационный проект (использовала библиотеку c ++ mbed), я столкнулся с этой проблемой. Демо-проект будет компилироваться просто отлично, но после того, как я заменил существующий основной файл самостоятельно, произошла эта ошибка.
В этот момент я еще не думал о том, что библиотека mbed, в которой я нуждалась, была написана на C ++. Мой собственный основной файл был .c файлом, который #include
mbed заголовочный файл. В результате я использовал свой обычный источник C, как если бы это был источник C ++. Поэтому компилятором, который использовался для компиляции моего основного файла, был компилятор C . Этот компилятор C тогда столкнулся с #include
модуля , который на самом деле не существует (в пределах его области), поскольку он не является компилятором C ++.
Только после того, как я проверил вывод из журнала построения я понял, что различные исходные файлы C и C ++ были скомпилированы более чем одним компилятором (компилятором c ++). В проекте использовались компиляторы arm-none-eabi-c ++ и arm-none-eabi-gcc (для встроенных систем), как показано ниже.
Журнал компиляции:
Building file: ../anyfile.cpp
Invoking: MCU C++ Compiler
arm-none-eabi-c++ "../anyfile.cpp"
Finished building: ../anyfile.cpp
Building file: ../main.c
Invoking: MCU C Compiler
arm-none-eabi-gcc "../main.c"
In file included from \mbed/mbed.h:21:0,
from ../main.c:16:
\mbed/platform.h:25:19: fatal error: cstddef: No such file or directory
compilation terminated.
Конечно, в среде C ++ cstddef существует , но в среде C cstddef не существует, вместо этого это просто реализация C stddef .
Другими словами, cstddef не существует в компиляторе C. Я решил эту проблему, переименовав свой файл main.c в main.cpp, а остальная часть кода тоже была скомпилирована.
TLDR / Заключение: при создании проекта на C ++ избегайте смешивания файлов C с файлами на C ++ ( источники и заголовки). Если возможно, переименуйте файлы .c в файлы .cpp, чтобы использовать компилятор C ++ вместо компилятора C. Там, где это необходимо.
метод класса А получает класс как неявный первый аргумент, точно так же, как метод экземпляра получает экземпляр.
class C:
@classmethod
def f(cls):
print(cls.__name__, type(cls))
>>> C.f()
C <class 'type'>
и это cls
канонически, btw
Первый параметр classmethod называют cls
условно и относится к объект класса , на который метод он был вызван .
>>> class A(object):
... @classmethod
... def m(cls):
... print cls is A
... print issubclass(cls, A)
>>> class B(A): pass
>>> a = A()
>>> a.m()
True
True
>>> b = B()
>>> b.m()
False
True
Объект класса передается как первый параметр. Например:
class Foo(object):
@classmethod
def bar(self):
return self()
возвратил бы экземпляр класса Foo.
РЕДАКТИРОВАНИЕ :
Примечание, что последняя строка была бы сам () не сам. сам возвратил бы сам класс, в то время как сам () возвращает экземпляр.