Я думаю, что g ++, начиная с версии 3, автоматически определяет _GNU_SOURCE
. Это подтверждается вашей третьей строкой в сообщении об ошибке, в котором говорится, что первое определение было выполнено в командной строке (не видно ни -D_GNU_SOURCE
):
<command-line>: error: this is the location of the previous definition
Если вы этого не хотите, #undef
это первая строка в вашем модуле компиляции. Это может вам понадобиться, однако, в этом случае используйте:
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
Причина, по которой вы получаете ошибку, состоит в том, что вы переопределяете ее. Это не должно быть ошибкой, если вы определите, что это уже было. По крайней мере, так обстоит дело с C, может быть иначе с C ++. Основываясь на заголовках GNU, я бы сказал, что они делают неявное -D_GNU_SOURCE=1
, поэтому он думает, что вы переопределяете это для чего-то другого.
Следующий фрагмент должен сообщить вам его значение, если вы его не изменили.
#define DBG(x) printf ("_GNU_SOURCE = [" #x "]\n")
DBG(_GNU_SOURCE); // first line in main.