【发布时间】: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