使用定义为#define的参数调用main函数

时间:2016-05-20 13:00:47

标签: c

我目前正在尝试从命令行获取参数到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自动将定义转换为相应的值并解析为函数参数。

3 个答案:

答案 0 :(得分:2)

您误解了预处理器定义的工作方式:它们是一个完全编译时的结构。当编译器完成转换时(事实上,当编译器启动转换时),BANK1BANK2等定义将无法挽回。

如果您想为数字使用符号名称,则需要自行构建此功能:将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)

致电时

./main BANK1 0x30 

BANK1是一个字符串。在您的代码BANK1中是一个整数。所以你必须映射它。将参数作为字符串读取,并在地图like here

中搜索它