Я пишу код в среде Arduino (1.6.5). В моем коде я хочу иметь возможность определить строковое значение, а затем использовать его, а также Serial.println() для последовательной консоли.
Например:
#define THEVAL 12345 // Define the value
...
v = v + THEVAL; // Use the value in code.
...
Serial.println("The value is: #THEVAL"); // Show the value to user (for debugging)
Однако компилятор не заменяет константы внутри строк в кавычках. Я также попробовал это (строковое преобразование C++), которое указывает, что вы помещаете константу вне строки в кавычках
#define THEVAL 12345
...
Serial.println("This is the value: " #THEVAL);
но это приводит к ошибке "Stray # character" в компиляторе.
Буду признателен за любую информацию! Спасибо!
РЕДАКТИРОВАТЬ: СТРАННОЕ ПОВЕДЕНИЕ
При тестировании я обнаружил следующее: (Примечание: IP-адрес использует запятые для разделения октетов, потому что каждый октет передается как отдельный параметр в EthernetServer.begin в массиве байтов (byte ip[] = { a, b, c, г })
#define IP_ADDRESS 192,168,1,1
#define IP_ADDRESS_STRING(a,b,c,d) xstr(a)"."xstr(b)"."xstr(c)"."xstr(d)
#define xstr(a) str(a)
#define str(a) #a
Если я сделаю следующее, я получаю сообщение об ошибке "IP_ADDRESS_STRING требует 4 аргумента, но только один указан"
debug("IP Address is: " IP_ADDRESS_STRING(IP_ADDRESS));
но если я сделаю следующее, я получаю сообщение об ошибке "макрос 'str' передал 4 аргумента, но принимает только 1"
debug("IP ADDRESS: " xstr(IP_ADDRESS));
Но если я сделаю это, это сработает:
String ipAddressString(int a, int b, int c, int d)
{
return String(a) + "." + String(b) + "." + String(c) + "." + String(d);
}
debug("IP Address is: " + ipAddressString(IP_ADDRESS));
Я запутался - почему один макрос считает IP_ADDRESS одним аргументом, а другой макрос видит его как 4 аргумента, а функция работает корректно: видит 4 аргумента?