5

#ifdefたとえば、条件付きの前処理を行ったレガシーコードがいくつかあり、マクロ#elseの使用が見つかった場所があります。__attribute__簡単な調査を行ったところ、GNU コンパイラに固有のものであることがわかりました。MSVC10 コンパイラを使用して Visual Studio 2010 でこのレガシー コードを使用する必要があります。例は次のとおりです。#ifndef#ifdef

#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 文字認識を自動的に調整することはできません。

どんな助けでも大歓迎です!ありがとう。

4

1 に答える 1

15

私の最善の推測は_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__条件は、明確にするために削除されています。)

于 2013-10-08T16:34:30.573 に答える