是否可以使用定义的常量在C中形成变量名的一部分?常量由Makefile定义.(实际上我想通过make参数传递它,如下所示)
例如,我想定义一个数字NUM并使用它声明一个变量.
#define NUM 5
/* I want to declare as below
int var5
using defined constant `NUM` above
*/
Run Code Online (Sandbox Code Playgroud)
我试过了
int var ## NUM;
Run Code Online (Sandbox Code Playgroud)
但##连接仅用于预处理宏操作,但不起作用.
实际上,常量NUM是从myfile中传入的(通过CFLAGS + = -DNUM = 5).
我怎样才能做到这一点?
根据Shachar Shemesh的回答,我试过这个.
=== test.c
#include <stdio.h>
#define compound_id(name1, name2) name1##name2
int compound_id(mynum, NUM);
main()
{
mynum5 = 5;
printf("NUM = %d\n", NUM);
printf("mynum5 = %d\n", mynum5);
Run Code Online (Sandbox Code Playgroud)
== Makefile
ifeq ($(NUM),5)
CFLAGS+=-DNUM=$(NUM)
endif
Run Code Online (Sandbox Code Playgroud)
==命令
make test NUM=5
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
ckim@stph45:/tmp] make test NUM=5
cc -DNUM=5 test.c -o test
test.c: In function 'main':
test.c:8: error: 'mynum5' undeclared (first use in this function)
test.c:8: error: (Each undeclared identifier is reported only once
test.c:8: error: for each function it appears in.)
make: *** [test] Error 1
Run Code Online (Sandbox Code Playgroud)
怎么了?
:我也试过了,(没有Makefile,只是运行make test)
=== test.c
#include <stdio.h>
#define NUM 5
#define mynum(X) (int mynum##X;)
mynum(NUM)
main()
{
printf("NUM = %d\n", NUM);
mynum5 = 5;
printf("mynum5 = %d\n", mynum5);
}
Run Code Online (Sandbox Code Playgroud)
并得到此错误:
ckim@stph45:/tmp] make test
cc test.c -o test
test.c:5: error: expected identifier or '(' before 'int'
make: *** [test] Error 1
Run Code Online (Sandbox Code Playgroud)
您需要使用宏来使用预处理器的串联.但是,为了确保您NUM的预处理也是如此,您必须使用两个级别的宏,例如:
#define CONCAT_IMPL(LHS, RHS) LHS ## RHS
#define CONCAT(LHS, RHS) CONCAT_IMPL(LHS, RHS)
Run Code Online (Sandbox Code Playgroud)