C - функция не возвращает значение? - PullRequest
0 голосов
/ 23 марта 2011

В моем заголовочном файле определен следующий метод

unsigned char test(void);

Реализация:

unsigned char test()
{
  unsigned char value = 0xFF;
  return value;    
}

Когда я вызываю его с этим:

 unsigned char temp;
 temp = test();

Ничеговозвращается ???Я прошел через это с контрольными точками.В самом конце значение переменной имеет значение 0xFF, но оно никогда не возвращается в temp?

Я не привык к простому старому C ... только C ++, может быть какая-то тонкая разницакак объявляются методы.

Любая помощь будет принята с благодарностью !!!

Ответы [ 4 ]

6 голосов
/ 23 марта 2011

Я думаю, вы видите умный компилятор. Если ваша переменная никогда не используется после присваивания, она просто оптимизируется. Однако эта функция все еще вызывается из-за возможного побочного эффекта.

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

Я думаю, что если вы добавите printf после присваивания или объявите свою tmp переменную volatile, вы также заметите назначение в отладчике.

2 голосов
/ 23 марта 2011

Если оптимизация включена, temp может храниться в регистре, и иногда у отладчиков могут возникнуть проблемы с поиском и отображением этих значений.На самом деле, компилятор вполне может отбросить возвращаемое значение, если вы его нигде не используете.Убедитесь, что ваш код скомпилирован без каких-либо оптимизаций для целей отладки.

В качестве альтернативы используйте самый старый метод, известный мужчинам для отладки: printf.:)

2 голосов
/ 23 марта 2011

Конечно, это не пользовательская ошибка отладчика? Большинство отладчиков не будут отображать значение переменной «temp» до следующей строки кода, когда назначение фактически выполнено.

0 голосов
/ 23 марта 2011

Если вызов функции был оптимизирован вашим компилятором, компилятор заметил, что вы ничего не делаете с temp, а вызов функции не имеет побочных эффектов, поэтому он оптимизировал его.

Попробуйте добавить printf после выполнения temp = test();, компилятор больше не будет выполнять ту же оптимизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...