是否可以在 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;
}

code running on ideone