Как я могу отключить переменную в C, чтобы позже можно было использовать то же имя с другим типом данных?

Я хочу использовать то же имя переменной с другим типом данных в программе C без приведения.

Я действительно хочу сделать это, не спрашивайте, почему.

Итак, как я могу это сделать?
И как я могу обработать ошибку, если эта переменная не существует во время профилактического отключения?


person AssemblerGuy    schedule 06.12.2010    source источник
comment
Я не понимаю, почему ты это делаешь. Я подозреваю, что вы пытаетесь добиться чего-то, что лучше сделать другим способом. Почему бы вам не рассказать нам, что вы пытаетесь сделать, чтобы вместо этого мы могли решить вашу настоящую проблему?   -  person Anon.    schedule 07.12.2010
comment
Не спрашивайте, почему говорить неправильно. Единственный способ ответить на такой вопрос — спросить, почему.   -  person David Heffernan    schedule 07.12.2010
comment
@Hans Passant: я не понял шутки.   -  person AssemblerGuy    schedule 07.12.2010


Ответы (6)


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

 {
     int val;

     // do something with 'val'
 }

 {
     double val;

     // do something with 'val'
 }
person Justin Spahr-Summers    schedule 06.12.2010

Если вы хотите, чтобы на одну и ту же память ссылались два разных типа, используйте объединение. В противном случае знайте, что дальше следует ужасная идея.

int foo;
float bar;
#define MY_NAME foo
// use MY_NAME as an int.
#undef MY_NAME
#define MY_NAME bar
// use MY_NAME as a float.
person nmichaels    schedule 06.12.2010
comment
@sgolodetz: я знаю. Мне немного стыдно. Но это отвечает на вопрос, и я не могу придумать ничего другого, что могло бы быть. - person nmichaels; 07.12.2010
comment
Это справедливый ответ в контексте :) Некоторые вопросы лучше оставить без ответа, хотя я думаю... - person Stuart Golodetz; 07.12.2010

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

Мое предложение - если вам абсолютно необходимо существовать в той же области - было бы префикс имени с буквой, идентифицирующей тип, поэтому:

int iVal;
double dVal;
person Daniel Bingham    schedule 06.12.2010
comment
лол, или вы можете добавить постфикс или изменить другое имя. Это решение. пожимает плечами Не зная больше о контексте, я не могу предложить лучшую схему именования, так что это лучший обобщенный вариант для этой ситуации ;) - person Daniel Bingham; 07.12.2010
comment
Согласовано. Что бы это ни стоило, я принадлежу к лагерю имен ваших переменных в соответствии с их фактическим назначением. Так что проблема иметь две переменные двух разных типов и желание называть их обе val возникает не слишком часто для меня :) - person Stuart Golodetz; 07.12.2010

используйте указатель void и приведите его соответствующим образом...

к настоящему времени вы должны спросить "WTF?" - и да, это то, о чем вы должны были спросить себя, когда вам пришла в голову идея перепечатать ваши переменные :)

person Community    schedule 06.12.2010
comment
пожалуйста следите за своим языком. - person Sapphire_Brick; 20.10.2019
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person nikhil sugandh; 08.12.2020

Когда вы определяете переменную с уже существующим именем, новое определение «скрывает» старое.

#include <stdio.h>
int main(void) {
    int variable = 42;
    printf("variable is an int and its value is %d\n", variable);
    {
        double variable = -0.000000000000003;
        printf("variable is a double and its value is %g\n", variable);
    }
    {
        FILE *variable = NULL;
        printf("variable is a FILE * and its value is NULL :-)\n");
    }
    printf("variable is an int again and its value is, again, %d\n", variable);
    return 0;
}
person pmg    schedule 06.12.2010
comment
На самом деле вы используете фигурные скобки для создания разных областей, в которых variable существует как 3 отдельные переменные. @Justin Spahr-Summers уже предложил это, и, по крайней мере, ИМО, похоже, это не то, о чем спрашивал ОП. - person GreenMatt; 07.12.2010
comment
Я согласен с @GreenMat. Это просто еще один пример для ОП. - person pmg; 07.12.2010

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

int myvar = 10;

// code using myvar as an int

#define myvar _myvar

char *myvar = "...";

// code using myvar as a char*

Тем не менее, я не могу препятствовать этому достаточно сильно. Не делай этого!

person Ferruccio    schedule 06.12.2010
comment
почему бы и нет? это сбивает с толку? - person Sapphire_Brick; 25.10.2019