#c #semantics
#c #семантика
Вопрос:
Это программа на языке си, демонстрирующая некоторые основы использования библиотеки libxml2. Ниже приведены цитаты из основной функции:
LIBXML_TEST_VERSION example1Func(argv[1]);
Что означает это утверждение?
Я могу только сказать, что LIBXML_TEST_VERSION, очевидно, является константой, и после этого происходит вызов функции, эта функция ничего не возвращает (void). Но я понятия не имею, что означает это утверждение в целом.
Комментарии:
1. Теперь мне ужасно жаль, потому что строка из оригинальной программы, на которую я ссылался, на самом деле состоит из двух строк. Я предполагаю, что система автоматического отступа моей IDE приняла неправильное решение. Итак, этот вопрос на самом деле бессмыслен.
2. Тем не менее, вы, ребята, впечатляюще быстры!
3. Нет проблем — сегодня мы все узнали, что: все символы верхнего регистра не обязательно являются константами, что вам не следует доверять форматированию кода и что делает макрос LIBXML_TEST_VERSION . 😉
Ответ №1:
LIBXML_TEST_VERSION
это не константа — это макрос — смотрите документацию здесь:
Macro: LIBXML_TEST_VERSION
#define LIBXML_TEST_VERSION
Macro to check that the libxml version in use is compatible with the version the software has been compiled against
Это также не имеет никакого отношения к вызову example1func()
— код должен выглядеть следующим образом (комментарии мои):
LIBXML_TEST_VERSION // test libxml version
example1func(); // call example1func
Комментарии:
1. 1: Этот вид макросов раздражает, хотя именно из-за такого рода путаницы. Я бы предпочел, чтобы макрос не определял конечную строку
;
, что, по крайней мере, заставило бы вас явно добавлять к экземпляру суффикс;
, тем самым уменьшая визуальную путаницу.2. @Oli: действительно — обычно многострочные макросы должны быть обернуты в
do { ... } while (0)
, чтобы разрешить использование завершающей точки с запятой
Ответ №2:
Создается впечатление, что LIBXML_TEST_VERSION
это макрос, который расширяется до одного или нескольких операторов. Из Google code search выясняется, что определение выглядит примерно так:
#define LIBXML_TEST_VERSION xmlCheckVersion(20703);
где 20703
находится та версия, для которой вы компилируете.
Это утверждение не зависит от вызова example1Func()
.
Ответ №3:
Это стандартное соглашение называть макросы препроцессора C в ALL_UPPERCASE. Как вы предполагаете, это часто используется для констант времени компиляции. Однако существуют и другие варианты использования.
Теперь к вашему примеру. Исходный код выглядит следующим образом (комментарии мои):
LIBXML_TEST_VERSION /* line 1 */
example1Func(argv[1]); /* line 2 */
Первая строка — это макрос C. Вторая строка — это вызов функции. Эти два не являются частью одного и того же утверждения, как следует из вашего вопроса. К сожалению, для определения способа LIBXML_TEST_VERSION
не требуется точка с запятой в конце; если бы это было так, не возникло бы путаницы в отношении того, являются ли две строки частью одного и того же оператора.
На случай, если вам интересно, что именно LIBXML_TEST_VERSION
:
Macro: LIBXML_TEST_VERSION
#define LIBXML_TEST_VERSION
Macro to check that the libxml version in use is compatible
with the version the software has been compiled against