【问题标题】:expected identifier in #define statement#define 语句中的预期标识符
【发布时间】:2017-08-03 11:06:19
【问题描述】:

[在下面查看我自己的答案。]

我的项目的头文件中有这段代码:

#ifdef _LINUX
    #ifdef BUILD_ext
        #define EXP_IMP_GLOBAL extern
    #else
        #define EXP_IMP_GLOBAL
    #endif
#else

当 BUILD_ext 被定义时,G++ 告诉我以下信息:

error: expected identifier before ‘extern’
         #define EXP_IMP_GLOBAL extern
                                ^
note: in expansion of macro ‘EXP_IMP_GLOBAL’
    class EXP_IMP_GLOBAL Classname
          ^~~~~~~~~~~~~~

我真的不知道如何处理此错误,因为未定义 BUILD_ext 时不会出现该错误,而且我也看不到为什么没有标识符。

【问题讨论】:

  • 好吧,class extern Classname 不是有效的 C++。
  • 您不能为课程指定extern。你想完成什么?

标签: c++ linux macros shared-libraries


【解决方案1】:

我真的不知道该怎么处理这个错误,因为这个错误并不 未定义 BUILD_ext 时出现,我也看不到,为什么会有 不会是标识符。

_LINUXBUILD_ext 都被定义时,EXP_IMP_GLOBAL 扩展为extern。所以你有:

class extern Classname

在您的代码中。

据此page

extern 说明符只允许在变量声明中使用 和函数(类成员或函数参数除外)。

因此,您不能将 extern 说明符与类声明/定义和编译器抱怨一起使用。

我猜你可能会简单地删除 EXP_IMP_GLOBAL 以消除错误,因为 EXP_IMP_GLOBAL 在像现在这样使用时没有意义。

【讨论】:

    【解决方案2】:

    这里的问题是,我完全误解了 extern 所做的事情。我想要的是控制我的库的某些类是否从外部可见,并且基本上也部分模仿 __declspec (dllexport)/__declspec (dllimport)

    的行为

    为了得到我需要的东西,我不得不换行

    #define EXP_IMP_GLOBAL extern
    

    #define EXP_IMP_GLOBAL extern __attribute__((visibility("default")))
    

    并使用编译器标志-fvisibility=hidden

    【讨论】:

      【解决方案3】:

      不确定您要做什么,但 extern 是 C++ 关键字,您不能那样使用它。此外,任何字符序列都必须放在引号之间:

      #define EXP_IMP_GLOBAL "extern"
      

      【讨论】:

      • 这是错误的。在宏中使用关键字没有这样的限制,也没有像使用引号这样的要求。如果这个定义被替换,你最终会得到例如。 class "extern" Classname,这比原来的意义还要小。
      • 编译这个:#define EXT test #include <iostream> int main() { std::cout << EXT << std::endl; return 0; }
      • 它不起作用,因为test 没有定义。在那种情况下,使用#define EXT "test" 是有意义的,但是在这种宏被替换为关键字的情况下,这是没有意义的——他不想要一个字符串,他想要一个语言特性。
      • @VladimirKanazir 编译:#define EXT test #include <iostream> int main() { int test = 0; std::cout << EXT << std::endl; return 0; }
      • 好吧,我们不知道 OP 到底想做什么,对吧?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多