Как вы объявляете строковые константы в C?

Я знаю, что это довольно идиоматично, или, по крайней мере, хороший стиль, в C, чтобы объявлять числовые константы как enum вместо #define их.

/* bad style */
#define MAXLINE 1024

/* good/better style */
enum {
    MAX_LINE = 1024
};

Существует ли эквивалентное правило для определения строковых констант?

/* is this good style? */
#define HELLO "Hello World"

/* or is this better? */
const char *HELLO2 = "Howdy";

Что вы предпочитаете? Если возможно, обнаружите некоторые недостатки любого метода.

Ответ 1

Там еще одна (по крайней мере) дорога в Рим:

static const char HELLO3[] = "Howdy";

(static - необязательный - должен помешать ему конфликтовать с другими файлами). Я бы предпочел этот вариант более const char*, потому что тогда вы сможете использовать sizeof(HELLO3), и поэтому вам не нужно откладывать до времени выполнения, что вы можете делать во время компиляции.

У определения есть преимущество конкатенации времени компиляции (думаю, HELLO ", World!"), и вы можете sizeof(HELLO).

Но тогда вы также можете предпочесть const char* и использовать его для нескольких файлов, что избавит вас от кучи памяти.

Короче - это зависит.

Ответ 2

Одно из преимуществ (хотя и очень незначительное) определения строки константы в том, что вы можете их соединить:

#define HELLO "hello"
#define WORLD "world"

puts( HELLO WORLD );

Не уверен, что действительно преимущество, но это метод, который нельзя использовать с const char *.

Ответ 3

Если вы хотите, чтобы строка "const string", как ваш вопрос, говорила, я бы действительно пошел на версию, указанную в вашем вопросе:

/* first version */
const char *HELLO2 = "Howdy";

В частности, я бы избегал:

/* second version */
const char HELLO2[] = "Howdy";

Причина: проблема со второй версией заключается в том, что компилятор сделает копию всей строки "Howdy", PLUS, эта строка может быть модифицируемой (так что не const).

С другой стороны, первая версия представляет собой строку const, доступную указателем const HELLO2, и никто не может ее модифицировать.

Ответ 4

Основным недостатком метода #define является то, что строка дублируется каждый раз, когда она используется, поэтому вы можете получить в ней много копий в исполняемом файле, делая ее более крупной.

Ответ 5

Для первого.  Перечисления по умолчанию являются целыми числами, что означает, что вы можете передать это значение только тому, что принимает только целые числа.

Вторая мне нравится лучше: const char * version вместо #define. Причина в том, что массивы в c являются указателями, что означает, что каждый раз, когда вы хотите использовать #define версию, вам нужно создать экземпляр этой строки, чтобы использовать ее.