0

我正在处理的代码是打开一个未初始化的文件并扫描以下变量。我试图弄清楚它在做什么,但我不明白 FSYM 和 ISYM 格式(?)试图做什么,除了可能将它们声明为 float 或 int 字符串。

sscanf(line, "%"ISYM" %"ISYM" %"ISYM" %"FSYM" %"FSYM" %"FSYM" %"FSYM" %"FSYM,
   &idummy, // nt   - skip
   &idummy, // l    - skip
   &idummy, // lev  - skip
   rad+nl,  // x    = radial coordinate
   vel+nl,  // xdot = radial velocity
   den+nl,  // rho  = density
   &dummy,  // tev  - skip temperature (eV)
   pre+nl   // p    = pressure
   );

line 是打开文件的第一行,然后将其扫描到变量中。关于发生了什么的任何想法?

4

2 回答 2

7

据推测,它们是在代码中某处定义的宏,它们扩展为包含字符串必要说明符的字符串文字scanf。他们会像

#define ISYM "d" // integer symbol for scanf
#define FSYM "f" // floating-point symbol for scanf

这样在展开之后,论点就变成了

"%""d"" %""d"" %""d"" %""f"" %""f"" %""f"" %""f"" %""f"

并且,由于连续的字符串文字被连接成一个字符串,这相当于

"%d %d %d %f %f %f %f %f"

如果您可能想要更改类型,这可能很有用:

#ifdef BIG_TYPES
    typedef long   i_type;
    typedef double f_type;
    #define ISYM "ld"
    #define FSYM "lf"
#else
    typedef int   i_type;
    typedef float f_type;
    #define ISYM "d"
    #define FSYM "f"
#endif

当然,C++ 有类型安全的 I/O 来避免这些废话:

std::istringstream ss(line);
ss >> idummy;
// and so on
于 2013-05-28T18:39:48.117 回答
1

那是预处理器字符串连接。它们必须在其他地方定义为字符串;当 cpp 碰到多个相邻的字符串时,它将它们连接在一起,因此代码使用预处理器从预定义的部分构建更长的字符串。

于 2013-05-28T18:39:05.987 回答