Erros, bugs, perguntas - página 2864

 
Andrey Khatimlianskii:

Então porque é que não funciona?

Muito provavelmente, esta abordagem não funciona em lado nenhum. Porque há uma substituição em curso onde o VALOR à direita é indefinido.

#define  VALUE (VALUE*2)
 
fxsaber:

Esta abordagem provavelmente não funciona em lado nenhum. Como há uma substituição em curso em que o VALOR à direita é indefinido.

E é mau mudar a substituição macroscópica de outra pessoa. Mais ainda, se estas são macros de ambiente predefinidas. Não importa onde no final estará a macro dominante, depois de todos os ficheiros do projecto terem sido reunidos. É melhor definir a sua própria _VALOR macro.
 
Vladimir Simakov:
Sim, e é mau mudar a substituição macroscópica de outra pessoa.

Sem este mal, não teria acontecido.

 
Vladimir Simakov:
E é mau mudar a substituição macroscópica de outra pessoa. Especialmente se forem macros de ambiente predefinidos. Não importa onde no final, depois de todos os ficheiros do projecto estarem reunidos, a sobreposição da macro irá acabar. É melhor definir a sua própria _VALOR macro.
Posso perguntar por que razão não se pode utilizar a atribuição de um valor VALOR a uma variável global e depois multiplicá-lo e substituí-lo na definição final?
 
Valeriy Yastremskiy:
Posso perguntar porque não se pode usar uma atribuição de VALOR a uma variável global e multiplicá-la e substituí-la na definição final?

Pode, mas depois perde-se o significado de substituição macro (valores substitutos no código). Toda a esperança permanece no compilador, de que este converta o tipo const (já definiu, a propósito, o tipo de variável?) para o tipo c++ constexpr

Mas caso contrário, sim, pode.

#ifdef  MACROS
   const int gValue=2*VALUE;
   #undef  VALUE
   #define  VALUE gValue
#endif
 
Vladimir Simakov:

Mas então, sim, pode.

Não vai funcionar com isso.

void Func( int = VALUE ) {}
 
fxsaber:

Não vai funcionar com este.

Mais uma vez, vamos pedir ao constexpr que o faça desta forma
constexpr auto x = 100;

void Foo(int _x = x) {
    std::cout << _x<<std::endl;
}

int main() {
    Foo();
    return 0;
}
 
fxsaber:

Esta abordagem provavelmente não funciona em lado nenhum. Como existe tal substituição em curso, onde o VALOR à direita não está definido.

Aparentemente, não compreendo de todo como funciona o compilador. Imaginei que as cordas são separadas sequencialmente. Portanto, não há nenhum valor indefinido à direita:

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10, следовательно VALUE = 20
 
Andrey Khatimlianskii:

Aparentemente, não compreendo de todo como funciona o compilador. Imaginei que as cordas são analisadas sequencialmente. Portanto, não há nenhum valor indefinido à direita:

Funciona de cima para baixo como uma substituição de texto. Isto é, "TMP" será substituído por "VALOR".

 
Andrey Khatimlianskii:

Aparentemente, não compreendo de todo como funciona o compilador. Imaginei que as cordas são analisadas sequencialmente. Portanto, não há nenhum valor indefinido à direita:

Não é o compilador - é o pré-processador)

#define  VALUE (TMP*2)

transforma-se em

#define  VALUE (VALUE*2)

e o seu VALOR é indefinido.