【问题标题】:Use the keyword class as a variable name in C++在 C++ 中使用关键字 class 作为变量名
【发布时间】:2010-05-15 18:11:31
【问题描述】:

我在编写使用为 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);

这在 C 中有效,因为 class 不是关键字,但在 C++ 中,class 是。那么无论如何我可以#include这个头文件到一个c ++文件中,还是我不走运?

谢谢。

【问题讨论】:

  • 如果该代码没有准备好被 C++ 编译器解析,请准备好迎接更多的麻烦。例如,如果这是您要链接的 C 库,则所有声明都应包含在 extern "C" 中,以便链接器知道它需要查找未损坏的符号。
  • 当我将#include 包装在外部“C”中时,编译器仍然会出错。我应该在你的里面加入 aaa 的把戏吗?
  • 我刚刚意识到这是一个 Python 标头。我不知道您使用的是哪个标头以及它的用途,但是您知道boost.org/doc/libs/1_43_0/libs/python/doc/index.html吗?

标签: c++ c keyword header-files


【解决方案1】:

试试这样的:

#define class class_variable
// if class is only used in declarations, you can also do
// #define class
#include "c.h"
#undef class

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

替代方案(使用 Makefile):

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

#include "python_.hpp"

【讨论】:

  • 它成功了......虽然我还没有链接这些库,但是谢谢。
  • @Leif 祝你好运。可能还想手动检查预处理文件,确保没有引入任何不需要的副作用
  • 如果您使用任何标准库头文件,则不允许使用关键字作为名称定义宏(参见stackoverflow.com/questions/2726204/…)。在这方面,C 比 C++ 宽松一点。
  • 它的意思是,如果标头包含任何标准头文件,这些行在 C++ 中是非法的,并且在下一版本的 C++ 标准中将是非法的句号。
  • 无意冒犯@aaa,但@Leif:我强烈认为你不会回答这个问题。就语言而言,这是非法的,完全没有必要。只需将 class 更改为 class_ 即可。
【解决方案2】:

如果这只是声明,那么变量名根本不重要。您可以完全删除它们或随意更改它们。这是因为声明仅仅定义了函数的名称和类型,即:

int BPY_class_validate(const char *, PyObject *, PyObject *,
                        BPY_class_attr_check*, PyObject **);

但是,如果您想要名称(更具描述性),您可以在您拥有的名称末尾添加一个下划线:

int BPY_class_validate(const char *class_type, PyObject *class_,
                        PyObject *base_class, BPY_class_attr_check* class_attrs, 
                        PyObject **py_class_attrs);

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

【讨论】:

    【解决方案3】:

    您始终可以使用 #ifdef __cplusplus 在该标头中创建特定于 C++ 的声明

    【讨论】:

    • 由于这是一个更大的代码库的一部分,我可能不应该在头文件本身中胡闹。
    【解决方案4】:

    您需要修改标头以将“类”替换为其他内容,以便将其编译为 C++。

    【讨论】:

      【解决方案5】:

      实际上,你运气不好。 “类”是一个保留字,不能作为变量标识符使用。

      我想你可以做一些预处理技巧,比如

      #define class othername
      

      但这也很愚蠢,因为它会使您的代码混乱并阻止您使用真正的类。

      硬着头皮把参数重命名为“theclass”之类的。

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 2011-09-02
        • 2019-12-01
        • 2018-10-30
        • 1970-01-01
        相关资源
        最近更新 更多