Каковы допустимые символы для макро-имен?

Примечание: Преобразование в строковое преобразование

Это происходит просто, если вы пытаетесь рассматривать массив как строку:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Массив не может быть просто echo 'd или конкатенируется с строкой, потому что результат не определен. PHP будет использовать строку «Array» вместо массива и вызвать уведомление, чтобы указать, что это, вероятно, не то, что было предназначено, и что вы должны проверять свой код здесь. Вероятно, вы захотите что-то вроде этого:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Или зациклируйте массив:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

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

40
задан a3f 31 March 2015 в 02:08
поделиться

3 ответа

Макро-имена должны только состоять из алфавитно-цифровых символов и подчеркиваний, т.е. 'a-z', 'A-Z', '0-9', и '_', и первый символ не должен быть цифрой. Некоторые препроцессоры также разрешают символ знака доллара ', но Вы не должны использовать его; к сожалению, я не могу заключить стандарт C в кавычки, так как у меня нет копии его.

От документация GCC :

маркеры Предварительной обработки попадают в пять широких классов: идентификаторы, предварительно обрабатывая числа, строковые литералы, punctuators, и другой. идентификатор совпадает с идентификатором в C: любая последовательность букв, цифр или подчеркиваний, который начинается с буквы или подчеркивания. Ключевые слова C не имеют никакого значения для препроцессора; они - обычные идентификаторы. Можно определить макрос, имя которого является ключевым словом, например. Единственный идентификатор, который можно считать ключевым словом предварительной обработки, defined. Посмотрите Определенный.

Это главным образом верно для других языков, которые используют препроцессор C. Однако несколько ключевых слов C++ являются значительными даже в препроцессоре. Посмотрите C++ Под названием Операторы.

В 1999 C стандарт, идентификаторы могут содержать буквы, которые не являются частью “basic исходного символа set”, по усмотрению реализации (такому как акцентируемые латинские буквы, греческие буквы или китайские идеограммы). Это может быть сделано с расширенным набором символов, или '\u' и '\U' escape-последовательности. Реализация этой функции в GCC экспериментальна; такие символы только приняты в '\u' и '\U' формы и только если -fextended-identifiers используется.

Как расширение, обработки GCC ' как буква. Это для совместимости с некоторыми системами, такими как VMS, где ' является наиболее часто используемым на определенные системой имена функций и имена объектов. ' не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

является наиболее часто используемым на определенные системой имена функций и имена объектов. ' не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

как буква. Это для совместимости с некоторыми системами, такими как VMS, где ' является наиболее часто используемым на определенные системой имена функций и имена объектов. ' не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

является наиболее часто используемым на определенные системой имена функций и имена объектов. ' не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

, но Вы не должны использовать его; к сожалению, я не могу заключить стандарт C в кавычки, так как у меня нет копии его.

От документация GCC :

маркеры Предварительной обработки попадают в пять широких классов: идентификаторы, предварительно обрабатывая числа, строковые литералы, punctuators, и другой. идентификатор совпадает с идентификатором в C: любая последовательность букв, цифр или подчеркиваний, который начинается с буквы или подчеркивания. Ключевые слова C не имеют никакого значения для препроцессора; они - обычные идентификаторы. Можно определить макрос, имя которого является ключевым словом, например. Единственный идентификатор, который можно считать ключевым словом предварительной обработки, defined. Посмотрите Определенный.

Это главным образом верно для других языков, которые используют препроцессор C. Однако несколько ключевых слов C++ являются значительными даже в препроцессоре. Посмотрите C++ Под названием Операторы.

В 1999 C стандарт, идентификаторы могут содержать буквы, которые не являются частью “basic исходного символа set”, по усмотрению реализации (такому как акцентируемые латинские буквы, греческие буквы или китайские идеограммы). Это может быть сделано с расширенным набором символов, или '\u' и '\U' escape-последовательности. Реализация этой функции в GCC экспериментальна; такие символы только приняты в '\u' и '\U' формы и только если -fextended-identifiers используется.

Как расширение, обработки GCC ' как буква. Это для совместимости с некоторыми системами, такими как VMS, где ' является наиболее часто используемым на определенные системой имена функций и имена объектов. ' не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

является наиболее часто используемым на определенные системой имена функций и имена объектов. ' не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

как буква. Это для совместимости с некоторыми системами, такими как VMS, где ' является наиболее часто используемым на определенные системой имена функций и имена объектов. ' не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

является наиболее часто используемым на определенные системой имена функций и имена объектов. ' не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

не буква в строго соответствующем режиме, или если Вы определяете -$ опция. Посмотрите Вызов.

36
ответ дан Adam Rosenfield 27 November 2019 в 01:48
поделиться

Вы правы, те же правила относятся к макросу и идентификаторам, насколько имена затронуты: допустимые символы [A-Za-z0-9 _].

Это - общее использование для использования ИСПОЛЬЗОВАННЫХ ДЛЯ СВОЕЙ ВЫГОДЫ имен для дифференциации макросов от других идентификаторов - переменные и имя функции.

8
ответ дан philant 27 November 2019 в 01:48
поделиться

Те же правила, которые определяют допустимые идентификаторы для имен переменной, относятся к макро-именам за исключением того, что макросы могут иметь те же имена как ключевые слова. Допустимые символы на имена идентификатора включают digits и non-digits и не должны запускаться с цифры. non-digits включают прописные буквы A-Z, строчные буквы a-z, подчеркивание, и любая реализация определила символы.

1
ответ дан Robert Gamble 27 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: