Const и #define в С

Цитата с одного из форумов:

когда пишешь на С++ дефайн нужно не использовать. когда пишешь на С
дефайн приходится использовать.

Цитата из книги:

const LONG NUM_SECTORS = 100; // Константа в стиле C++ 
#define MAX_CELLS 64 //Константа в стиле С

Почему в коде на C широко используется #define, а не const?
Что мешает задавать константы в коде на C через const, так же, как это делается в С++?

Цитата из книги «Язык программирования C. Лекции и упражнения, 5-е издание» Стивен Прата:


Модификатор const

В С глобальные идентификаторы const имеют внешнее связывание, но в C++ — внутреннее связывание. Другими словами, объявление в C++

const double PI = 3.14159;

эквивалентно следующему объявлению в С:

static const double PI = 3.14159;

при условии, что оба они находятся вне функций. Правила C++ нацелены на то, чтобы упростить применение const в файлах заголовков. Если константа имеет внутреннее связывание, то каждый файл, включающий заголовок, получает собственную копию константы. Если же константа имеет внешнее связывание, то в одном файле должно присутствовать определяющее объявление, а во всех остальных файлах должно использоваться ссылочное объявление с ключевым словом extern.

Кстати, в C++ ключевое слово extern может применяться для обеспечения внешнего связывания значения const, поэтому оба языка позволяют создавать константы с внешними внутренним связыванием. Разница состоит лишь в том, какой вид связывания используется по умолчанию.

Одно дополнительное свойство ключевого слова const в C++ заключается в том, что оно может применяться для объявления размера обычного массива:

const int ARSIZE = 100;
double loons[ARSIZE]; /* в C++ это то же, что и double loons[100]; */

Такое же объявление можно делать и в С99, но это приведет к созданию массива переменной длины.

В языке C++, но не в С, значения const можно использовать для инициализации других значений const:

const double RATE = О.Об; // допустимо в C++, С
const double STEP =24.5; // допустимо в C++, С
const double LEVEL = RATE * STEP; // допустимо в C++ , недопустимо в С

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.