首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中的运行时条件类型定义

C++中的运行时条件类型定义
EN

Stack Overflow用户
提问于 2012-07-18 20:20:39
回答 5查看 5.6K关注 0票数 2

我知道这个问题有一个C++版本,但是我使用的是标准的typedefs而不是模板。

我写了一个可以处理16位wav文件的程序。它通过将每个样本加载到一个短片中来实现这一点。然后,程序对短值执行算术运算。

我现在正在修改程序,以便它可以与16位和32位wavs一起使用。我希望做一个条件类型定义,也就是用short表示16位,int表示32位。但后来我意识到,如果编译器事先不知道变量的类型,它可能不会编译代码。

因此,我尝试测试以下代码:

代码语言:javascript
运行
复制
#include <stdio.h>

int
main()
{
  int i;
  scanf("%i", &i);

  typedef short test;

  if(i == 1)
    typedef short sample;
  else 
    typedef int sample;

  return 0;
}

并得到以下编译器错误:

代码语言:javascript
运行
复制
dt.c: In function ‘main’:
dt.c:12:5: error: expected expression before ‘typedef’
dt.c:14:5: error: expected expression before ‘typedef’

这是否意味着在C中运行时条件typedefs是不可能的?

开放式问题:如果没有,你们会如何处理这样的事情?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-18 20:29:41

程序中的所有类型在编译时都必须是已知的。

在C++中,您可以使用模板为shortint编译代码;在C中,您可以使用宏(特别是X宏)来编译代码。

将您的计算代码放在一个名为dt.tmpl.c的单独文件中,然后在dt.c中编写:

代码语言:javascript
运行
复制
#define sample int
#include "dt.tmpl.c"

#define sample short
#include "dt.tmpl.c"

然后,您的dt.tmpl.c代码可以使用sample作为预处理器令牌来命名类型并粘贴到函数名称中,例如:

代码语言:javascript
运行
复制
#define PASTE(name, type) name ## _ ## type
#define FUNCTION_NAME(name, type) PASTE(name, type)

sample FUNCTION_NAME(my_calculation, sample)(sample i) {
    return i * 2;
}

这将产生两个函数int my_calculation_int(int i)short my_calculation_short(short i),然后您可以在其他地方使用它们。

票数 3
EN

Stack Overflow用户

发布于 2012-07-18 20:25:13

typedef是一个编译器特性,你不能在运行时应用它。

票数 5
EN

Stack Overflow用户

发布于 2012-07-18 20:28:48

首先,类型定义不是一个新的类型,它是一个别名或缩写形式,以使事情更方便(特别是在使用函数指针时)

C是一种静态语言,你不能在运行时创建类型,类型需要在编译/链接时解析。

好吧,如果可能的话,windows API会小得多:)

在windows中,几乎每个API调用都有两个版本的函数和一个决定使用哪个函数的定义。

例如:

代码语言:javascript
运行
复制
#ifndef UNICODE
#define myfunction _myfunctionA(TCHAR* p);
#else
#define myfunction _myfunctionW(TCHAR* p);
#endif

但同样,类型是在编译时决定的

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11541226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档