我目前正在尝试从命令行获取参数到c中的主函数。我的计划如下。
#include <stdio.h>
#include <stdlib.h>
#define BANK1 (0X00100)
#define BANK2 (0x11010)
.
.
#define BANKN (0xNNNNN)
int write_to_bank(int bank, int value);
int main(int argc, char **argv)
{
int a,v;
a=strtol(argv[2],NULL,0);
v=strtol(argv[3],NULL,0);
write_to_bank(a,v);
}
int write_to_bank(int bank, int value){
// some relevant code
}
如果我按如下方式传递参数,则整数被正确解析为函数
./main 0x00100 0x20
但是当我尝试通过以下方式将参数传递给我的main函数时,我实际上并没有解析右边的值
./main BANK1 0x30
有没有办法可以将定义作为参数传递给我的主要功能,其中c自动将定义转换为相应的值并解析为函数参数。
答案 0 :(得分:2)
您误解了预处理器定义的工作方式:它们是一个完全编译时的结构。当编译器完成转换时(事实上,当编译器启动转换时),BANK1
和BANK2
等定义将无法挽回。
如果您想为数字使用符号名称,则需要自行构建此功能:将argv[1]
或argv[2]
的检查添加为包含BANK1
或{的C字符串{1}}使用BANK2
,然后调用strcmp
或使用预定义的常量:
strtol
注意:如果您对#define STR(X) #X
...
int parse(const char* str) {
if (strcmp(str, STR(BANK1)) == 0) {
return BANK1;
}
if (strcmp(str, STR(BANK2)) == 0) {
return BANK2;
}
return strtol(str, NULL, 0);
}
的工作原理感到好奇,请查看stringizing operator。
答案 1 :(得分:0)
C预处理器不是编译器的一部分,而是单独的 进入编译过程。简单来说,C预处理器就是 只是一个文本替换工具,它指示编译器执行 在实际编译之前需要进行预处理。阅读here
这意味着当您拥有.exe文件时,不会引用BANK1 - BANK2
,依此类推。
它们在编译阶段与它们的值相互作用。事实上:
#define
替换预处理器宏。
当您输入只是字符串的输入BANK1
时!
如果您尝试此示例,则可以了解预处理器的工作原理。当您编译代码时,它会将__TIME__
常量替换为当前时间,并且只要您执行代码,它就会打印您编译时的时间:
#include <stdio.h>
int main(){
printf("Time :%s\n", __TIME__ );
getchar();
}
更多阅读here
答案 2 :(得分:-1)