【问题标题】:Visual C++ 2010 solution-wide macros with parameters带有参数的 Visual C++ 2010 解决方案范围的宏
【发布时间】:2011-02-26 00:21:05
【问题描述】:

我正在尝试使用 Visual C++ 2010 Express 编译一些源代码。该代码是为 GCC 编写的,包含如下属性:

struct something {
...
} __attribute__((packed));

由于这不是标准的 C++ 语法,Visual C++ 无法识别它。在结构声明之前使用此宏,它可以正常工作:

#define __attribute__(p)

但我不想更改文件。我创建了一个新的属性表 (GccCompat),然后转到预处理器定义,并添加了宏,如下所示:

__attribute__(p)

或者像这样:

__attribute__(p)=

但它不起作用。它根本没有被调用。如果我在同一位置仅定义 __attribute__(不带参数),则宏定义正确。请注意,生成的命令行看起来不错(带参数的宏的传递与没有参数的宏完全相同),但编译器似乎忽略了它。那么,我怎样才能用参数全局定义我的宏呢?

【问题讨论】:

  • 这是错字吗? GCC 扩展名是 __attribute__,但您在问题的 MSVC 部分中提到了 __attributes__
  • 这是一个错字。我在实际项目中使用了__attribute__

标签: c++ visual-studio-2010 visual-c++ c-preprocessor


【解决方案1】:

这可能是不可能的,至少这样是不可能的。请注意,Microsoft 的 documentation of the /D option 没有为带参数的宏指定语法。

【讨论】:

  • 既然你写了“至少那样”,我也接受其他方式:) 如果没有必要,我只是不想更改原始代码。不过,如果我找不到更好的解决方案,我会为打包添加条件编译。
【解决方案2】:

在 IDE 中定义宏通常侧重于为编译器创建 /D:CPP_TOKEN 标志的性质,即#define CPP_TOKEN。

在高级编译器设置中,您可以定义这样的宏,例如 /D:"attributes(p)=/nothing/" 或类似的东西。只需打开 VS 命令提示符并查看它的内容。 GCC 4.2 将允许这样的事情(使用它的 -D 开关),但我手边没有 MSVC10。

【讨论】:

  • 请注意,将带有参数的宏添加到属性表生成/D "__attribute__(p)"作为命令行。它只是行不通。但是,“高级”似乎是一个好点:在高级 C++ 选项中,有一个强制包含文件选项。我只使用所需的定义创建了一个小文件,并将其添加为强制包含,并且它可以工作。现在,出于某种奇怪的原因,我发现了 __attribute 的出现(没有尾随下划线)......
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 2012-07-31
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多