Локальная синонимическая переменная не точного типа - PullRequest
0 голосов
/ 08 июня 2011

Я немного новичок в C, поэтому я не знаю, как бы я подошел к решению этой проблемы.Читая дальше, вы заметите, что не критично, что я нахожу решение, но оно наверняка подойдет для этого приложения и для справок в будущем.:)

У меня есть параметр int hello, и я не хочу делать его синонимичную копию.

f(int hello, structType* otherParam){  
  // I would like to have a synonom for (!hello)
}

Моей первой мыслью было создание локальной константы, но я 'Я не уверен, будет ли дополнительное потребление памяти.Я строю с GCC, и я действительно не знаю, распознает ли он константу параметра (перед любыми изменениями) как синонимичную переменную.Я так не думаю, потому что параметр мог (хотя и не будет) изменяться позже в этой функции, что не повлияло бы на константу.

Затем я подумал о создании локального определения типа, но яне уверен точно, синтаксис для этого.Я попытался сделать следующее:

typedef (!hello) hi;

Однако я получаю следующую ошибку.

D:/src-dir/file.c: In function 'f':
D:/src-dir/file.c: 00: error: expected identifier or '(' before '!' token

Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 08 июня 2011

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

В вашем примере часто используемых вычислений наиболее подходящим способом для этого является сохранение результата в const -квалифицированной переменной - что-то вроде следующего:

void f(int hello)
{  
    const int non_hello = !hello;

    /* code that uses non_hello frequently */
}

или более вероятно:

void x(structType *otherParam)
{  
    char * const d_name = otherParam->b->c->d->name;

    /* code that uses d_name frequently */}
}

Обратите внимание, что такая const переменная не обязательно должна быть выделена для какой-либо памяти (если вы не берете ее адрес с & где-нибудь) - оптимизатор может просто поместить ее в регистр (и имейте в виду, что даже если получает выделенную память, он, вероятно, будет стековой памятью.

1 голос
/ 08 июня 2011

Typedef определяет псевдоним для типа, это не то, что вам нужно.Итак ..

  • Просто используйте !hello там, где вам нужно

Зачем вам нужен "синоним" для !hello?Любой программист мгновенно распознает !hello вместо того, чтобы искать ваш умный прием для определения «синонима».

0 голосов
/ 08 июня 2011

Дано:

f(int hello, structType* otherParam){  
  // I would like to have a synonom for (!hello)
}

Очевидный, прямой ответ на то, что у вас здесь будет:

f(int hello, structType *otherParam) { 
    int hi = !hello;
    // ...
}

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

В некоторых случаях подобное может сделать код более читабельным. Также обратите внимание, что когда / если вы измените значение hello, значение hi будет не изменено для соответствия (если вы не добавите код для его обновления). Это редко проблема, но о чем-то нужно знать.

...