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


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

/* 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";

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

4 52

4 ответа:

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

static const char HELLO3[] = "Howdy";

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

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

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

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

одно преимущество (хотя и очень небольшое) определения строки константы - это то, что вы можете объединить их:

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

puts( HELLO WORLD );

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

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

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

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

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

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

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

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