我正在处理的代码是打开一个未初始化的文件并扫描以下变量。我试图找出它在做什么,但我不明白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
);
行是打开文件的第一行,然后将其扫描到变量中。关于发生了什么的任何想法?
答案 0 :(得分: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
答案 1 :(得分:1)
这是预处理器字符串连接。必须将它们定义为其他地方的字符串;当cpp命中多个相邻的字符串时,它将它们连接在一起,因此代码使用预处理器从预定义的部分构建一个更长的字符串。