組み込みプラットフォームでLinaro Ubuntu 12.03を実行しています。簡単なプログラムを作成するためにこのシステムを数か月使用した後、最適化オプションを追加するとコンパイル エラーが発生するようになりました。そこで、テストプログラムを作成しました:
// test.c
#include <string.h>
int main(int argc, char *argv[])
{
    return 0;
}
コンパイル:
gcc test.c
うまく動作します。ただし、最適化オプションを追加すると:
gcc -O1 test.c
エラーが発生します:
In file included from /usr/include/string.h:637:0,
                 from test.c:1:
/usr/include/arm-linux-gnueabi/bits/string2.h:1305:3: error: "(" may not appear in macro parameter list
-O1これは からまでのすべてのレベルで発生します-Ofast。
Linaro Ubuntu 12.04を使用して別の組み込みシステムで同じことを試してみると、問題なく動作します。私のUbuntu PCでもそうです。
のコード セクションstring2.h:
#  define __strdup(sp \
  (__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s)       \
          ? (((__const char *) (s))[0] == '\0'                \
             ? (char *) calloc ((size_t) 1, (size_t) 1)           \
             : ({ size_t __len = strlen (s) + 1;              \
              char *__retval = (char *) malloc (__len);       \
              if (__retval != NULL)                   \
                __retval = (char *) memcpy (__retval, s, __len);  \
              __retval; }))                       \
          : __strdup (s)))
(問題はマクロの 2 行目にあります)
明確な理由もなくビルド環境が機能しなくなったのはなぜですか?
更新 1:
12.03 を実行している別のボードと 12.04 システム上の同じファイルを調べました。確かにstring2.h1stボードのファイルに構文エラーがあるようです。他の 2 つのファイルは次のことを示しています。
#  define __strdup(s) \
それ以外の:
#  define __strdup(sp \
そのため、)に置き換えられましたp。今考えられる唯一の説明は、使用している SD カードがファイルを破損し始めたということです。ただし、他の説明は大歓迎です。