【问题标题】:special character in #define macro#define 宏中的特殊字符
【发布时间】:2024-01-20 15:29:01
【问题描述】:

我是 C++ 新手,面临下面提到的一个简单问题。 在 Visual C++ 2008 中,我试图 #define 类似

#define fromThis*  toThisPtr
#define fromThis   toThisObj

我正在移植一些用linux编写的代码,需要按照winapi进行移植。我得到的错误 像这样的。

 error C2008: '*' : unexpected in macro definition
 warning C4005: 'fromThis' : macro redefinition
 see previous definition of 'fromThis'

我需要在预处理期间重新定义 fromThis* 和 fromThis。 #define 宏中的特殊字符是否不允许? 我怎样才能把这段代码弄出来?


EDIT-1: 我正在寻找可能的解决方案。我正在尝试将 *fromThis 替换为 'toThisPtr'。一种建议的解决方案是使用 typedef。我喜欢下面的。

typedef toThisPtr   fromThis*;
typedef toThisObj   fromThis;

现在有了这个解决方案,我得到的错误是:

错误 C2143:语法错误:缺少 ';'前 '*' 错误 C2059:语法错误:';' 错误 C2040:“iovec”:“toThisObj”与“toThisPtr”的间接级别不同

typedef 可以解决这个问题。将fromThis*替换为toThisPtr的std方法是什么?

【问题讨论】:

    标签: c++ windows visual-c++ macros porting


    【解决方案1】:

    #definedocumentation 表示其第一个参数是标识符。标识符只能包含字母、数字和下划线,并且不能以数字开头。

    因此,fromThis* 不是有效标识符,您不能将 #define 用于其他内容。

    【讨论】:

      【解决方案2】:

      也许你只是把它弄反了

      #define toThisPtr fromThis*
      #define toThisObj fromThis
      

      这定义了两个名为 toThisPtr 和 toThisObj 的宏。否则我很难理解你想要做什么。

      【讨论】:

      • 他希望在预处理期间将fromThis* 替换为toThisPtr
      【解决方案3】:

      你不能这样做,也不应该这样做。 :)

      为此,我个人会使用typedefs 而不是宏。

      typedef toThisPtr fromThis*
      typedef toThisObj fromThis
      

      然后全部替换。

      【讨论】:

      • 我尝试了您的建议,但在 vs2008 中出现错误 |错误 C2143:语法错误:缺少“;”在''| 之前错误 C2059:语法错误:';' |错误 C2040:“iovec”:“toThisObj”与“toThisPtr”的间接级别不同 |在 typedef 中使用 '' 也是错误的吗?有什么标准方法可以将 fromThis* 替换为 toThisPtr。
      • typedef 指令必须以分号 ; 结尾。 typedef vs #define 的另一个优点是第一个属于命名空间,第二个就像“搜索和替换”。
      【解决方案4】:

      您不能在名称中使用 *。 请参阅文档摘录:

      您可以将任何有效标识符定义为宏,即使它是 C 关键词

      有效的标识符是一个或多个字母、数字或 下划线字符 (_)。既不是空格也不是标点符号 符号可以是标识符的一部分。只有字母、数字和单个 下划线字符有效。此外,变量标识符 总是必须以字母开头。

      【讨论】:

        最近更新 更多