#define 语句中的预期标识符

expected identifier in #define statement

[请参阅下面我自己的回答。]

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

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

G++ 在定义 BUILD_ext 时告诉我以下内容:

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 未定义时错误不会出现,而且我也不明白,为什么没有标识符。

I don't really know what to make of this error since the error doesn't appear when BUILD_ext is not defined and I also don't see, why there would be no identifier.

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

class extern Classname

在你的代码中。

据此page:

The extern specifier is only allowed in the declarations of variables and functions (except class members or function parameters).

因此您不能将 extern 说明符与 class declaration/definition 一起使用,编译器会报错。

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

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

#define EXP_IMP_GLOBAL "extern"

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

的行为

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

#define EXP_IMP_GLOBAL extern

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

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