You need another layer of indirection and for id
to be a macro, not a variable (it can't work with a variable -- macros work at the token level; they can't know the value of a C variable, only the value of a preprocessor macro).
The following modified code works (i.e., prints 10):
#include
using namespace std;
#define channel1 10
#define channel_(id) channel##id
#define channel(id) channel_(id)
#define id 1
int main(){
cout << channel(id)<<"\n";
return 0;
}