Делает ли «-dndebug» (в нижнем регистре) что-нибудь в g ?

#c #makefile #g

#c #makefile #g

Вопрос:

Я работаю над незначительными изменениями в многоплатформенном проекте C с 400-строчным файлом Linux makefile, который кто-то создал несколько лет назад.

Две строки в makefile используют -dndebug (нижний регистр) в качестве аргумента командной строки для g .
Я думаю, что целью было определить ndebug символ, но делает ли аргумент вообще что-нибудь, когда он в нижнем регистре?

У меня минимальные знания о g и Make, но, исходя из параметров страницы, управляющих препроцессором, я думаю, что аргумент должен быть прописным, чтобы работать.

Комментарии:

1. у gcc действительно есть -d опция, но она предназначена для отладки, компилятор проходит сам. Вам это не нужно. И даже если это было задумано, -dndebug недопустимо (но, например -da , есть). Так что, я полагаю, так и должно быть -DNDEBUG , но кто-то все испортил.

2. Для всех, кто редактирует этот вопрос: я думаю, что редактирование, которое изменило «dndebug» на «DNDEBUG» в названии, было неуместным, поскольку весь смысл вопроса состоял в том, чтобы спросить, делает ли он что-нибудь в нижнем регистре.

Ответ №1:

Да, это должно быть в верхнем регистре, как это -DNDEBUG .

-D является ли параметр GCC для определения макроса. NDEBUG должен ли быть определен макрос для отключения утверждений в соответствии со стандартом C.

У меня минимальные знания о g и Make, но, исходя из параметров страницы, управляющих препроцессором, я думаю, что аргумент должен быть прописным, чтобы работать.

Что касается -dndebug , поскольку макросы чувствительны к регистру, я думаю, что это не будет иметь никакого эффекта, т. Е. Оно должно игнорироваться, если у вас нет какого-либо кода, который ссылается на него.

Ответ №2:

Это довольно легко протестировать:

Тестовая программа test.cpp

 #include <iostream>

int main()
{
#ifdef TEST_DEFINE
    std::cout << "defined" << std::endl;
#endif
    return 0;
}
  

Результат

 $ g   -o 1 -DTEST_DEFINE test.cpp
$ ./1
defined
$ g   -o 2 -dTEST_DEFINE test.cpp
cc1plus: warning: unrecognized gcc debugging option: T [enabled by default]
cc1plus: warning: unrecognized gcc debugging option: E [enabled by default]
cc1plus: warning: unrecognized gcc debugging option: S [enabled by default]
cc1plus: warning: unrecognized gcc debugging option: T [enabled by default]
cc1plus: warning: unrecognized gcc debugging option: _ [enabled by default]
cc1plus: warning: unrecognized gcc debugging option: E [enabled by default]
cc1plus: warning: unrecognized gcc debugging option: F [enabled by default]
cc1plus: warning: unrecognized gcc debugging option: E [enabled by default]
$ ./2
$
  

Итак, как вы можете видеть, опция -d фактически вызывает предупреждения компилятора, поэтому похоже, что -D — это то, что было задумано.

Комментарии:

1. Ах, это объясняет четыре предупреждения, которые я вижу в конце процесса создания. Я не связывал эти предупреждения с этим аргументом, хотя я удивлен, что «e» и «u» являются единственными символами, которые отображаются как нераспознанные. Спасибо.