是否可以在 C 中自动生成的变量名中使用 __LINE__?
Is it possible to use __LINE__ in the auto-generated variable name in C?
为了避免重复,我想在自动生成的变量名中使用__LINE__
。
#define ROUTE(path, impl) \
char * k##impl##__LINE__##_route = "{"#path":\""#impl"\"}";
但它始终被视为普通字符串__LINE__
。
即使我这样定义,也得不到我想要的:
#define ROUTE(path, impl) ROUTE_(path, impl, __LINE__)
#define ROUTE_(path, impl, line) \
char * k##impl##line##_route = "{"#path":\""#impl"\"}";
这个有效:
#define CAT_(A,B) A##B
#define CAT(A,B) CAT_(A,B)
#define ROUTE(path, impl) \
char * CAT(CAT(k##impl,__LINE__),_route) = "{"#path":\""#impl"\"}";
您还需要一层嵌套:
#define ROUTE(path, impl) ROUTE_(path, impl, __LINE__)
#define ROUTE_(path, impl, line) ROUTE_1(path, impl, line)
#define ROUTE_1(path, impl, line) \
char * k##impl##line##_route = "{"#path":\""#impl"\"}";
如果您不使用变量,请尝试 "compound literals"
#include <stdio.h>
#include <time.h>
int main(void) {
// using preprocessor 'trick'
struct tm uniquenamewith__LINE__inthename = {0};
uniquenamewith__LINE__inthename.tm_year = 2019 - 1900;
uniquenamewith__LINE__inthename.tm_mon = 12 - 1;
uniquenamewith__LINE__inthename.tm_mday = 18;
time_t foo = mktime(&uniquenamewith__LINE__inthename);
// using compound literal
time_t bar = mktime(&(struct tm){.tm_year=2019-1900, .tm_mon=12-1, .tm_mday=18});
printf("foo is %lu, bar is %lu\n", (unsigned long)foo, (unsigned long)bar);
return 0;
}
为了避免重复,我想在自动生成的变量名中使用__LINE__
。
#define ROUTE(path, impl) \
char * k##impl##__LINE__##_route = "{"#path":\""#impl"\"}";
但它始终被视为普通字符串__LINE__
。
即使我这样定义,也得不到我想要的:
#define ROUTE(path, impl) ROUTE_(path, impl, __LINE__)
#define ROUTE_(path, impl, line) \
char * k##impl##line##_route = "{"#path":\""#impl"\"}";
这个有效:
#define CAT_(A,B) A##B
#define CAT(A,B) CAT_(A,B)
#define ROUTE(path, impl) \
char * CAT(CAT(k##impl,__LINE__),_route) = "{"#path":\""#impl"\"}";
您还需要一层嵌套:
#define ROUTE(path, impl) ROUTE_(path, impl, __LINE__)
#define ROUTE_(path, impl, line) ROUTE_1(path, impl, line)
#define ROUTE_1(path, impl, line) \
char * k##impl##line##_route = "{"#path":\""#impl"\"}";
如果您不使用变量,请尝试 "compound literals"
#include <stdio.h>
#include <time.h>
int main(void) {
// using preprocessor 'trick'
struct tm uniquenamewith__LINE__inthename = {0};
uniquenamewith__LINE__inthename.tm_year = 2019 - 1900;
uniquenamewith__LINE__inthename.tm_mon = 12 - 1;
uniquenamewith__LINE__inthename.tm_mday = 18;
time_t foo = mktime(&uniquenamewith__LINE__inthename);
// using compound literal
time_t bar = mktime(&(struct tm){.tm_year=2019-1900, .tm_mon=12-1, .tm_mday=18});
printf("foo is %lu, bar is %lu\n", (unsigned long)foo, (unsigned long)bar);
return 0;
}