Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

__attribute__() macro and its effect on Visual Studio 2010 based projects

I have some legacy code that has got conditional preprocessing e.g. #ifdef and #else where I have found the use of __attribute__ macro. I have done a quick research and found out that it is specific to GNU compilers. I have to use this legacy code in Visual Studio 2010 using MSVC10 compiler and apparently it is complaining everywhere it sees attribute((unused)) even though it is protected by #ifndef and #ifdefs. An example is:

#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!" } ;

I am really struggling to understand if it is very poorly planned code or is it just my misunderstanding. How do I avoid the usual compiler and linker errors with this __attribute__() directive? I have started to get C2061 errors (missing identifiers/unknown). I have got all necessary header files and nothing is missing, may be except GNU compiler (which I don't want!!).

Also, it seems that the end of line character ; is also being messed up when I take to code in windows....argh....I mean the UNIX end-of-line and Windows EOL how can I use this code without modifying the body....I can define in my property sheet about the _WINDOWS thingy, but cannot automatically adjust the EOL character recognition.

ANy help is appreciated! Thanks.

like image 701
ha9u63ar Avatar asked Oct 08 '13 13:10

ha9u63ar


1 Answers

My best guess is that _WINDOWS is, in fact, not defined by your compiler, and so use of __attibute__ is not protected.

In my opinion, the best way to protect against attributes is to define a macro like this:

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

That should simply remove all __attribute__ instances from the code.

In fact, most code that has been written to be portable has this:

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

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

(Other __tone_z__ conditional removed for clarity only.)

like image 125
ams Avatar answered Oct 23 '22 23:10

ams