предварительная обработка кода сборки не работает (#if #else #endif)

Вот ассемблерный код bootcode.S

        .section boot, "ax", %progbits

get_intid:
        #if INTGRP==NSG1
            #warning taking NSG1
                mrs     x0, s3_0_c12_c12_0
        #else
            #warning taking G0
                mrs     x0, s3_0_c12_c8_0
        #endif
                ret
        .end

Теперь я хочу сделать предварительную обработку, чтобы по переменной INTGRP (либо NSG1, либо G0) в файле .S выбиралась соответствующая строка, а результат записывался бы в файл .s.
Когда я пытаюсь gcc -E -DINTGRP=G0, он всегда выбирает вторую строку. На самом деле это не зависит от опции -D. Итак, как я должен дать команду, чтобы часть #if стала истинной?

ДОБАВИТЬ:
по комментариям я понял, что не так. Итак, правильный метод:

        .section boot, "ax", %progbits
#define G0 0
#define NSG1 1

get_intid:
#if INTGRP==NSG1
            #warning taking NSG1
                mrs     x0, s3_0_c12_c12_0
#else
            #warning taking G0
                mrs     x0, s3_0_c12_c8_0
#endif
                ret
        .end

и используйте команду

cc -E -DINTGRP=0 bootcode.S -o bootcode.s

or

cc -E -DINTGRP=1 bootcode.S -o bootcode.s

Спасибо за помощь!


person Chan Kim    schedule 04.05.2021    source источник
comment
Где вы ожидаете, что используемые G0 и NSG1 будут определены? Предоставьте полный минимально воспроизводимый пример. (под другим углом к ​​той же проблеме, упомянутой Питером Кордесом ниже)   -  person Yunnosch    schedule 04.05.2021
comment
== всегда является числовым, не сравнивая имена токенов. Неопределенные имена токенов оцениваются как 0 в #if выражениях (после раскрытия любых определенных макросов). Похоже на дубликат.   -  person Peter Cordes    schedule 04.05.2021
comment
Народ, спасибо за комментарии. Я понял, что не так, и я добавил #define для G0 и NSG1 и вызвал cc -E с определенным значением. Я обновлю вопрос прямо сейчас.   -  person Chan Kim    schedule 04.05.2021
comment
Обычный метод — это макрос, подобный #ifdef INTGRP_USE_NSG1, а другой параметр неявно — G0. Меньше строк настройки, чтобы заставить его работать. Магические числа (0 и 1) в командной строке компилятора не лучше, чем -DINTGRP_USE_NSG1 или -UINTGRP_USE_NSG1 (или ничего).   -  person Peter Cordes    schedule 04.05.2021
comment
Кроме того, для реальной сборки вы обычно просто cc -c -D... foo.S выполняете предварительную обработку и сборку за один шаг. В этом весь смысл использования заглавных .S имен файлов.   -  person Peter Cordes    schedule 04.05.2021