【问题标题】:__attribute__() macro and its effect on Visual Studio 2010 based projects__attribute__() 宏及其对基于 Visual Studio 2010 的项目的影响
【发布时间】:2013-10-08 13:48:24
【问题描述】:

我有一些经过条件预处理的遗留代码,例如#ifdef#else 在那里我发现了 __attribute__ 宏的使用。我做了一个快速的研究,发现它是特定于 GNU 编译器的。我必须使用 MSVC10 编译器在 Visual Studio 2010 中使用这个遗留代码,显然它在看到 attribute((未使用)) 的任何地方都在抱怨,即使它受到 #ifndef#ifdefs 的保护。一个例子是:

#ifdef __tone_z__
  static const char *mcr_inf
#else
  static char *mcr_inf
#endif
#ifndef _WINDOWS
__attribute__(( unused ))    % this is causing all the problem!!
#endif
= "@(#) bla bla copyright bla";



#ifdef __tone_z__
   static const char *mcr_info_2a353_id[2]
#else
   static       char *mcr_info_2a353_id[2]
#endif
__attribute__(( unused )) = { "my long copyright info!" } ;

我真的很难理解这是计划得很糟糕的代码还是只是我的误解。如何使用此 __attribute__() 指令避免常见的编译器和链接器错误?我已经开始收到 C2061 错误(缺少标识符/未知)。我已经获得了所有必要的头文件,并且没有任何遗漏,可能除了 GNU 编译器(我不想要!!)。

另外,当我在 Windows 中编写代码时,行尾字符 ; 似乎也被弄乱了......啊......我的意思是 UNIX 行尾和 Windows EOL 如何我可以在不修改正文的情况下使用此代码吗....我可以在我的属性表中定义 _WINDOWS 东西,但不能自动调整 EOL 字符识别。

任何帮助表示赞赏! 谢谢。

【问题讨论】:

  • 请注意,__attribute__ 不是宏。在 Windows 上编译时,请确保您 #define _WINDOWS 1
  • @MarcGlisse 谢谢……这就是我所希望的。我使用的是 Visual Studio 2010,如果您按 CTRL+,您可以看到所有允许的预定义函数属性和宏 - _WINDOWS 不存在。我将在属性表​​或我的主要方法运行程序文件中执行此操作。
  • 您可能想要#ifndef _MSC_VER 而不是#ifndef _WINDOWS。当您包含<windows.h> 时,存在一个名为_WINDOWS_ 的定义(但请注意附加的尾随下划线),但通常区分GCC/MSVC 的方法是通过GCC_MSC_VER 定义。

标签: visual-studio-2010 gcc macros compiler-errors legacy-code


【解决方案1】:

我的最佳猜测是,_WINDOWS 实际上没有由您的编译器定义,因此__attibute__ 的使用不受保护。

在我看来,防止属性的最好方法是定义这样的宏:

#define __attribute__(A) /* do nothing */

这应该只是从代码中删除所有 __attribute__ 实例。

事实上,大多数可移植的代码都有这样的:

#ifdef _GNUC
  #define ATTR_UNUSED __attribute__((unused))
#else
  #define ATTR_UNUSED
#endif

static TONE_Z_CONST char *integ_func ATTR_UNUSED = "my copyright info";

(其他 __tone_z__ 有条件的删除只是为了清楚起见。)

【讨论】:

  • 没用!我已经做了足够的谷歌研究,似乎没有什么能解决这个问题。我只需要使用为 GNU C 编译器编写的遗留代码并将其放在 Visual Studio 2010 上。我还更新了代码 sn-p!
  • MicroSoft 编译器不会接受任何 __attribute__ 关键字或任何其他 GNU 扩展;甚至一些标准的 C/C++ 也是有问题的。您将不得不手动或通过预处理器删除所有这些东西。我已经向你展示了一些方法。真的没那么难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多