Stringify C预处理器

时间:2012-10-11 16:34:29

标签: c c-preprocessor stringification

这是我的第一篇文章,所以如果我太模糊或提供每个人都会直观地假设的信息,请告诉我。

我很想写 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

这不起作用,任何能够指出您认为我可能有的任何误解都会受到高度赞赏。

编辑 - 所以我确实弄明白为什么在尝试-DSEED=a时收到错误消息,因为它将其作为变量读取。

1 个答案:

答案 0 :(得分:7)

要对#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. */

如果您只想使用一个字符,只需通过*pszSeedpszSeed[0]访问它。