Что означает «CONST func (arg);» на языке C?

#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