2016-02-01 2 views
-4

Я использовал ниже простой код:Идентификация типов данных в C/C++

#define char long long int 
int main() 
{ 
    cout<<sizeof(char) << endl; 
    // want to use char as a 1 byte data type 
} 

У меня есть идея, что если #define используется в программе, то определение расширяется во время компиляции. Но теперь, если я хочу использовать char как 1-байтовый тип данных, что мне делать? Является ли это возможным ?

+1

Зачем вам это делать в первую очередь? –

+0

Я просто хочу определить использование #define в любой программе. – sunkuet02

+0

Затем вам нужен инструмент, который читает файл кода и перечисляет все строки #define. –

ответ

3

17.6.4.3.1 Имена макросов [macro.names]

1 Перевод блок, который включает в себя стандартный заголовок библиотеки не должен #define или #undef имена, объявленные в любом стандартном заголовке библиотеки.
2 Единица перевода не должна содержать #define или #undef, лексически идентичные ключевым словам.

Итак, что бы вы ни делали после определения, семантика программы в любом случае не определена.

ОБНОВЛЕНИЕ: Техническое поведение не определено только при включении любого заголовка из стандартной библиотеки. Вы, кажется, так поступаете, когда используете cout. В любом случае, не включая стандартный заголовок, это очень тяжелое ограничение.

предыдущий стандарт цитата предшествует:

17.6.4.3 зарезервированные имена [reserved.names]

1 C++ стандарт резервирует библиотеки следующие виды имен:
- макросы
- глобальные названия
- имена с внешней связью
2 Если программа объявляет или определяет имя в контексте, где оно зарезервировано, кроме как явно разрешено is Clause, его поведение не определено.

+0

Следует добавить, что это верно в случае OP, потому что он использует 'std :: cout' и, следовательно, должен использовать стандартную библиотеку (если только его' cout' на самом деле не является чем-то совершенно другим :)). Технически стандарт фактически позволяет переопределить 'char', если ваша программа не использует стандартную библиотеку. Конечно, вы никогда не должны думать об этом так или иначе. –

+0

@ user2079303: Весь раздел 17 посвящен только стандартной библиотеке. В частности, в §17.6.4.1/1 говорится: * «В этом разделе описаны ограничения на программы на С ++, которые используют возможности стандартной библиотеки C++». * –

+0

@ChristianHackl благодарит вас за разъяснения. Теперь он тоже в ответе, поэтому я удалю свой комментарий. – user2079303

1

Вы должны использовать

#undef char 

и после этого, вы можете использовать символ, как вы хотите.

Но это действительно опасно переопределить ключевое слово с помощью макроса.

1

После того, как вы #define что-то, он остается определенным для этого значения для остальной части блока компиляции.

Во время конкретной единицы компиляции вы можете отменить свой #define с помощью #undef.

Уверен, вам не нужно говорить, что использование изменения ключевого слова с помощью #define является пагубным.

+0

прилагательного: пагубные синонимов: \t вредна, ущерб, разрушительный, вредный, вредный, ущерб, вредный, опасный, неблагоприятный, враждебный, нездоровый, неблагоприятно, плохой, злой, недобрый, злой, злой, злой, злокачественный, вредный, ядовитые , развращение; –

Смежные вопросы