при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
The ANSI C standard supports the concept of the tentative definition. Any external data declaration that has no storage class specifier and no initializer is considered a tentative definition. If the identifier declared appears in a later definition, then the tentative definition is treated as if the extern storage class specifier were present. In other words, the tentative definition becomes a simple referencing declaration.
If the end of the translation unit is reached and no definition has appeared with an initializer for the identifier, then the tentative definition becomes a full definition, and the object defined has uninitialized (zero-filled) space reserved for it.
Unlike ANSI C, C++ doesn't have the concept of a tentative declaration; an external data declaration without a storage class specifier is always a definition.
Код: Выделить всё
extern char s1;Код: Выделить всё
#include "sample.h"
char s1 = INIT_S1;Код: Выделить всё
#include "sample.h"
s1 = 2;Код: Выделить всё
char uartTxChar;
char uartRxChar;
Код: Выделить всё
extern char uartTxChar;
extern char uartRxChar;
Код: Выделить всё
#include "Uart.h"
//Пользуемся uartTxChar и uartRxChar
Воу воу воу, полегче. А как же статический класс с публичным свойством или шаблон "одиночка"? Все они представляют некое глобальное состояние, как и глобальная переменная в Си.ks0 писал(а):В современных языках C# или Java понятия глобальных переменных вообще нет.
Не можно static, а нужно static, это является хорошим тоном, но всё же мы имеем дело с Си, поэтому...ks0 писал(а):Т.е. переменные, с которыми работает модуль, описываются в модуле, можно с модификатором static, а изменяются только за счет функций, объявленных в его хедере.
...всё же не стоит принимать это как закон. В некоторых ситуациях глобальные переменные (как и злополучный goto кстати) могут не только упростить реализацию, но и сделать её более изящной и понятной.ks0 писал(а):не объявляйте в хедере переменные вообще никак
Код: Выделить всё
u08 test(void) {
return data;
}Вопрос один - что означает слово static, символ @ и последующее с ним значение? как я понял, это адрес в памяти, где хранится данное значение?// Банк 0 [0x0020 - 0x006F]
static volatile unsigned int adcP0 @ 0x24; // результат АЦП0
static volatile unsigned char adcP0L @ 0x24; // результат АЦП0 младший
static volatile unsigned char adcP0H @ 0x25; // результат АЦП0 старший
static volatile unsigned int num @ 0x26; // ширина импульса
static volatile unsigned char numL @ 0x26; // ширина импульса младший
static volatile unsigned char numH @ 0x27; // ширина импульса старший
static volatile unsigned char nserv @ 0x2A; // номер прерывания
// ----------------------------------------
Код: Выделить всё
static delta = 10;
void main (void)
{
uint8_t temp;
for (uint8_t i = 0; i < 10; i++) {
temp = up();
}
}
uint8_t up (void) {
static up = 0;
up++;
return up;
}Эээ... Разве? Она не будет обнуляться при каждом вызове функции?slavokhire5 писал(а):последовательно значения от 1 до 10.
Код: Выделить всё
static up;
up = 0;Код: Выделить всё
static up = 0;