mic*_*elp 3 c stringification c-preprocessor
这是我的第一篇文章,所以如果我太模糊或提供每个人都会直观地假设的信息,请告诉我.
我很擅长用C语写作,我只是想更好地理解预处理.我正在编写一个简单的程序,可以直接从控制台使用gcc -Wall -std=c99 -DSEED=argument参数,我的参数应该是一个整数,或者如果-D没有定义,用户将输入它.
SEED值仅用于srand().我很困惑,为什么我的代码不能编译,如果我输入一个-DSEED=a作为我的参数,而如果我把-DSEED=1它编译.我得到了一个"未声明的(在这个函数中首次使用)"错误并且真的不明白两者之间的区别.我认为#define变量类型与输入匹配,所以如果我输入"a"#SEED将是一个char,如果我输入"1"#SEED将是一个int.
如果未定义SEED,我正在使用#ifndef SEED命令,这很有效.我想我应该"输入"输入SEED,然后检查它是否是整数.在线阅读一些文章之后我正在尝试使用:
#ifndef SEED
//code
#else
#define TO_STRING( input ) #input
char c;
c = TO_STRING( SEED )
//Then I was going to use c to figure out if it was an int.
#endif
Run Code Online (Sandbox Code Playgroud)
这是行不通的,任何能够指出你认为我可能有任何误解的人都会非常感激.
编辑 - 所以我确实弄清楚为什么我在尝试时收到错误消息-DSEED=a,因为它是将其作为变量读取.
要进行字符串化,#define您需要使用两步法:
#define _STRINGIFY(s) #s
#define STRINGIFY(s) _STRINGIFY(s)
...
#define SEED 123
...
const char * pszSeed = STRINGIFY(SEED); /* 'pszSeed' would point to "123" form here on. */
Run Code Online (Sandbox Code Playgroud)
如果您只想使用一个字符,只需通过*pszSeed或访问它pszSeed[0].