2015-04-25 3 views
0

Мне нужно указать короткий аргумент аргумента (например, -F) как char, так и char[] константа в c-коде. Чтобы максимизировать повторное использование кода, я хочу объявить переменную, которая позволяет мне изменять значение в одном месте («буквальный» - не строгий разговор с строкой или char буквально, а в смысле абстрактной концепции). Я бы предпочел решение, которое решает это исключительно в препроцессорных константах, функциях/макросах или исключительно в c-коде, чтобы дать хорошее объяснение, почему это нужно решить в смеси обоих.Как повторно использовать литерал в символе и односимвольной строковой константе?

Я попытался/проверил

  • к #define FOREGROUND_OPTION_VALUE 'F', который вызывает у меня проблемы, чтобы превратить его в char[] (как константы препроцессора) (написание макроса, который stringifies с # вызывает ' кавычки, чтобы быть строковой, а
  • опустить ' кавычки, которые оставляют меня с проблемой создания ' кавычки или создать char другой путь.
  • @ ответ PedroWitzel, чтобы объявить char[] и используйте 0-й char для другой константы. Это нормально, но я бы предпочел создать char[] из char, потому что это означает, что оба равны (в противном случае мне пришлось бы добавить утверждение времени компиляции, которое char[] не больше 1).

Единственное, что имеет значение для меня, это обслуживание кода, ничего другого (например, стоимость обработки кода (во время компиляции или времени выполнения - не отразились интенсивно, если они могут быть и не заботятся)).

+1

Сохранение одного символа данных целесообразно только в том случае, если (в буквальном смысле) нет необходимости в обработке кода. –

ответ

3

Позапрограмное обсуждение в comments к Pedro Witzel «s answer, есть еще один вариант:

#define FOREGROUND_OPTION_VALUE 'F' 

static const char fg_opt_str[] = { FOREGROUND_OPTION_VALUE, '\0' }; 

Это не часто используемый способ инициализации строки, но это действует одна и кажется подходящий для вашего сценария. Теперь вы можете использовать FOREGROUND_OPTION_VALUE, где вам нужно постоянное значение char (или int) и fg_opt_str, где вам нужна односимвольная строка. Если вы измените значение, определенное (например, на f), вам нужно изменить только одно место для продолжения работы кода, предполагая, что вы раньше не использовали f, что соответствует требованиям ремонтопригодности.

+0

Спасибо. Как уже упоминалось в моем вопросе, будет оценено утверждение о том, является ли эта смесь определения препроцессора и исходным кодом c необходимым (помимо того факта, что это абсолютно справедливо). –

+0

Это зависит от того, что вы хотите сделать. Это может быть необязательно, если ваш код имеет дело только со строками или только с символьными константами. Но если вам нужно обоим, и они должны быть синхронизированы автоматически, тогда вам понадобится какой-то метод вдоль линий, описанных здесь, и Педро Витцелем, чтобы выполнить эту работу. Что лучше всего подходит для вас, зависит от ваших требований. Мы не можем видеть достаточно вашего кода, чтобы иметь возможность сообщить об этом. –

+0

Мне нужна константа и не указывал на это в первоначальном вопросе, который был не очень умным. Понятно, если мне нужна константа, только, хотя ?! –

2

A static constant переменная будет работать на вас?

static const char FOREGROUND_OPTION_VALUE[] = "F"; 
+0

Как это повторное использование спецификации 'F' для' char' и 'char []' в одном месте? –

+0

@KarlRichter: когда вам нужна строка, которую вы используете 'FOREGROUND_OPTION_VALUE', когда вам нужен символ' char', вы используете '* FOREGROUND_OPTION_VALUE'. –

+3

@KarlRichter: вы используете 'FOREGROUND_OPTION_VALUE', когда вам нужна строка и' FOREGROUND_OPTION_VALUE [0] 'или' * FOREGROUND_OPTION_VALUE', когда вам нужен один символ. Это так же хорошо, как и получается. Вы не сможете использовать это как метку 'case' в инструкции' switch', но кроме этого, она должна быть работоспособной. Вы также можете использовать '#define FOREGROUND_OPTION_VALUE" F "' как в вопросе, и любое из выражений, которое я предложил получить к символу. –

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