#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» являются единственными символами, которые отображаются как нераспознанные. Спасибо.