7

Fedora Linux の gcc と clang の最近のバージョンでは、次のプログラムがエラーなしでコンパイルされます。

#include <ctype.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    char c = 'a';
    if islower(c)
        printf("%d", c);
    else
        printf("%c", c);
    return 0;
}

これは gcc 4.7.2 と clang 3.0 で発生します。対照的に、私の Mac では、予想どおり、gcc 4.2.1 と Apple clang 4.1 の両方が、"if islower(c)" 行に括弧がないことを訴えます。いずれの場合も、"-std=c99" を指定してコンパイラを実行しました。

これは gcc と clang の最近のバージョンのバグですか、C 言語の癖ですか、それとも何か他のものですか? C99 標準 ( http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf p. 133) では、すべての場合に if 式を括弧で囲むことが義務付けられているようです。

4

2 に答える 2

13

それislower()はマクロである可能性が高く、展開によって括弧が追加されます。

オプションを使用してコンパイルすることで取得できる、GCC からの前処理済みの出力を投稿し-Eます。

于 2012-10-02T15:08:12.280 に答える
10

ctype.hにあるファイルを調べた/usr/include/ctype.hところ、 の次の定義が見つかりましたislower

#define islower(c)  __isctype((c), _ISlower)

私が見つけたの定義に行く__isctype()

#define __isctype(c, type) \
  ((*__ctype_b_loc())[(int) (c)] & (unsigned short int) type)

したがって、コードは次のif islower(c)ように展開されます。

if ((*__ctype_b_loc())[(int) (c)] & (unsigned short int) _ISlower)

アンワインドが言ったように、展開中に括弧を追加しました。

于 2012-10-02T15:28:02.290 に答える