在C++中使用关键字class作为变量名

Lei*_*sen 11 c c++ header-files keyword

我在编写使用为C文件设计的头文件的C++代码时遇到问题.特别是,头文件使用了一个名为class的变量名:

int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs);
Run Code Online (Sandbox Code Playgroud)

这适用于C,因为类不作为关键字,但在C++中,类是.那么无论如何我可以将这个头文件#include到c ++文件中,或者我运气不好?

谢谢.

Any*_*orn 10

尝试这样的事情:

#define class class_variable
// if class is only used in declarations, you can also do
// #define class
#include "c.h"
#undef class
Run Code Online (Sandbox Code Playgroud)

它可能会导致问题,但也许值得一试

替代(使用Makefile):

python_.hpp: /usr/include/python.h
    perl -pe 's/\Wclass\W//g' $< > $@
...

#include "python_.hpp"
Run Code Online (Sandbox Code Playgroud)

  • 它的含义是,如果标题包含任何标准头文件,那么这些行在C++中是非法的,并且在下一版本的C++标准中它将是非法时期. (4认同)
  • 对@aaa没有冒犯,但@Leif:我强烈认为你没有这个答案.它在语言方面是非法的,完全没必要.只需将`class`改为`class_`并完成它. (2认同)

GMa*_*ckG 8

如果这只是声明,则变量名称根本不重要.您可以完全删除它们或按您喜欢的方式更改它们.这是因为声明只定义了函数的名称和类型,即:

int BPY_class_validate(const char *, PyObject *, PyObject *,
                        BPY_class_attr_check*, PyObject **);
Run Code Online (Sandbox Code Playgroud)

但是如果你想要这些名称(更具描述性),你可以在你拥有的名字的末尾抛出一个下划线:

int BPY_class_validate(const char *class_type, PyObject *class_,
                        PyObject *base_class, BPY_class_attr_check* class_attrs, 
                        PyObject **py_class_attrs);
Run Code Online (Sandbox Code Playgroud)

这不会破坏任何其他代码.