strtol と integer constant(整数定数)

手元にある「ANSI C 言語大辞典」によると、strtol は

base が 0 であれば、strtol は整数定数の形式を読み込む。

と書かれていて、じゃあ整数定数は何かというと

0xFFFE
12345UL

というような表記形式である。


簡単なテストをしてみたら、手元の gcc で期待通りに動かない。

コード:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    char *tail;
    long l = strtol("12345L", &tail, 0);
    printf("l=%ld, tail=%s\n", l, tail);
    return 0;
}

出力:

l=12345, tail=L


最後の L は整数定数表記の一部なので、末尾部に含まれるのではなく、本体に含まれて変換されて欲しいのだけど、動作としてそうはなっていない。

しかし、よく考えると基数は 36 まで許容されているので、L が果たして long を表すサフィックスなのか n 進数の数値の一部なのかは誰にも判断できないので、無視されてしかるべきだ。