怎样解析出C源文件中的变量的类型
在某些情况下,我们需要在 C++ 中查找变量的动态类型或运行时的类型。因此,C++ 库为我们提供了不同的方法来查找变量的类型。一、使用 typeid 运算符查找变量的类型;二、使用 decltype() 说明符查找变量的类型;三使用GCC编译器来编译C源文件。

一、使用 typeid 运算符查找变量的类型
typeid 运算符存在于 C++ 的 <typeinfo> 库中,用于查找运行时提供的变量类型。但是,用于查找变量类型的完整函数是 typeid(x).name(),其中 x 是应该找到其类型的变量。
使用的 name() 成员函数返回标识变量类型的字符序列。
但是,它将返回数据类型的首字母作为输出。例如,对于 int,它将返回 i,对于 float“f,对于 double,它将返回 d 作为类型。
让我们看看在 C++ 中使用 typeid 运算符来查找变量类型的代码。
#include <iostream>
#include <typeinfo>
using namespace std;
int main() {
int x = 200;
float y = 200.790;
cout << typeid(x).name() << endl;
cout << typeid(y).name() << endl;
cout << typeid(x*y).name() << endl;
return 0;
}
输出:
i
f
f
上面的输出显示 i 指的是 integer 类型,而 f 指的是 float 类型。此外,C++ 中的 typeid 也用于返回表达式的类型。
在上面的例子中,在 typeid 运算符中传递的表达式是两种不同数据类型 int 和 float 的乘积;因此,结果将被转换为更大的数据类型。
二、使用 decltype() 说明符查找变量的类型
decltype(x) 说明符是在 C++11 中引入的。它是一个运算符,用于获取结果表达式的类型。
auto 关键字用于声明具有特定类型的变量,而 decltype 提取该变量类型。auto 和 decltype 都基于类型推断,即自动推断数据类型。
让我们看一个使用 decltype 运算符在 C++ 中查找变量类型的示例。
#include <bits/stdc++.h>
#include <cstring>
using namespace std;
float function1() { return 4.5; }
int function2() { return 34; }
int main()
{
decltype(function1()) a;
decltype(function2()) b;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
return 0;
}
输出:
f
i
上例中变量 a 和 b 的数据类型将与 function1 和 function2 的返回类型相同。
decltype 运算符的另一个示例如下,它提取 C++ 中表达式的类型。
#include <bits/stdc++.h>
using namespace std;
int main()
{
float ft = 4.8;
decltype(ft) a = ft + 9.8;
cout << typeid(a).name();
return 0;
}
输出:
f
输出 f 指的是 float 数据类型。因此,添加表达式 ft+9.8 后,结果数据类型将是 float。
然而,typeid 和 decltype 运算符之间的主要区别在于 typeid 在运行时提供有关类型的信息,而 decltype 在编译时提供类型信息。
三、使用GCC编译器来编译C源文件
GCC是GNU编译器集合的缩写,主要用于编译C和C++语言。您可以使用以下命令来编译C源文件:
“`
gcc <your_file>.c -o <your_output>
“`
其中,`<your_file>.c`是您要编译的源文件名,`<your_output>`是您要生成的输出文件名。
延伸阅读
一、C 中的变量定义
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:
type variable_list;
在这里,type 必须是一个有效的 C 数据类型,可以是 char、w_char、int、float、double 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:
int i, j, k;
char c, ch;
float f, salary;
double d;
行 int i, j, k; 声明并定义了变量 i、j 和 k,这指示编译器创建类型为 int 的名为 i、j、k 的变量。
变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示:
type variable_name = value;
下面列举几个实例:
extern int d = 3, f = 5; // d 和 f 的声明与初始化
int d = 3, f = 5; // 定义并初始化 d 和 f
byte z = 22; // 定义并初始化 z
char x = ‘x’; // 变量 x 的值为 ‘x’
不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
二、C 中的变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
1、一种是需要建立存储空间的
例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。
例如:extern int a 其中变量 a 可以在别的文件中定义的。
除非有extern关键字,否则都是变量的定义。
extern int i; //声明,不是定义
int i; //声明,也是定义

