3

这是我的第一篇文章,所以如果我太含糊或给出每个人都会直觉认为的信息,请告诉我。

我对用C编写语言非常陌生,只是想更好地理解预处理。我正在编写一个简单的程序,它可以使用 直接从控制台接收参数gcc -Wall -std=c99 -DSEED=argument,其中我的参数应该是一个整数,或者如果-D未定义用户将输入它。

SEED 值仅用于srand(). 我很困惑为什么如果我把一个-DSEED=a作为我的参数我的代码不会编译,而如果我把-DSEED=1它会编译。我收到“未声明(在此函数中首次使用)”错误,我真的不明白两者之间的区别。我认为#define变量类型与输入相匹配,所以如果我输入一个“a”#SEED 将是一个字符,如果我输入一个“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,因为它正在将它作为变量读取。

4

1 回答 1

7

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

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

于 2012-10-11T16:43:33.567 回答