【问题标题】:Stringify C preprocess字符串化 C 预处理器
【发布时间】:2012-10-11 16:34:29
【问题描述】:

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

我对用 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 时收到错误消息,因为它正在将其作为变量读取。

【问题讨论】:

  • 一方面,一个字符不能被分配一个字符串字面量。

标签: c c-preprocessor stringification


【解决方案1】:

要对#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] 访问它。

【讨论】:

  • 这绝对有效!非常感谢。你能告诉我我的想法是否正确,为什么它真的有效吗?所以第一个 _STRINGIFY(s) 会因为“#”而将任何东西变成一个字符串,第二个 STRINGIFY 会将一个扩展的宏放入第一个 #define?最后的跟进。我只能在宏中使用 # 来创建字符串吗?非常感谢您的帮助!
猜你喜欢
  • 2011-11-15
  • 2011-10-22
  • 1970-01-01
  • 2019-06-21
  • 2016-08-14
  • 1970-01-01
  • 2011-09-24
  • 2013-11-13
相关资源
最近更新 更多