#define语句中的预期标识符

时间:2017-08-03 11:06:20

标签: c++ linux macros shared-libraries

[请参阅下面的答案。]

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

#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时错误没有出现,我也不知道为什么没有标识符。

3 个答案:

答案 0 :(得分:3)

  

我不知道该错误是什么,因为错误并非如此   当BUILD_ext没有定义时出现,我也不知道为什么会这样   将不是标识符。

如果同时定义了_LINUXBUILD_ext,则EXP_IMP_GLOBAL会扩展为extern。所以你有:

class extern Classname

代码。

根据page

  

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

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

我想您可能只是删除EXP_IMP_GLOBAL以消除错误,因为EXP_IMP_GLOBAL在使用它时没有意义。

答案 1 :(得分:0)

这里的问题是,我完全误解了extern做了什么。我想要的是控制我的图书馆的某些类别是否从外部可见而且基本上部分地模仿__declspec (dllexport)/__declspec (dllimport)的行为

为了得到我需要的东西,我不得不改变这条线

#define EXP_IMP_GLOBAL extern

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

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

答案 2 :(得分:-3)

不确定您要做什么,但 extern 是C ++关键字,您无法以这种方式使用它。此外,任何字符序列都必须放在引号之间:

#define EXP_IMP_GLOBAL "extern"