Как вы объявляете строковые константы в C?
Я знаю, что это довольно идиоматично, или хороший стиль, по крайней мере, в C, чтобы объявить числовые константы как enum
s вместо #define
ing их.
/* 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 ответа:
есть еще одна (по крайней мере) дорога в Рим:
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, и нет никакого способа любой может изменить его.