标签: ansi-c

C,C99,ANSI C和GNU C有什么区别?

我已经开始编写关于codechef的编程实践,并且对C和C99之间区别感到困惑.C在这里意味着什么?是C89吗?检查此提交底部的语言.它包含C和C99.

我在互联网上发现了一个名为GNU C的东西.对于linux/unix系统有不同的C吗?这些是否符合ANSI的C标准?我也在一些地方读过"C99严格".这是什么?

是否还有其他不同的C标准?有没有叫做C 4.3.2的东西,还是当前使用的gcc版本?

编辑:

这个,这个,这有帮助.我会搜索更多并编辑未回答的内容.

我不是一个编程新手.我知道C语言是什么.我知道ANSI有不同的C标准,如C89,C99和C11.

c gcc c99 c89 ansi-c

115
推荐指数
4
解决办法
7万
查看次数

如何将枚举类型变量转换为字符串?

如何让printf显示枚举类型变量的值?例如:

typedef enum {Linux, Apple, Windows} OS_type; 
OS_type myOS = Linux;
Run Code Online (Sandbox Code Playgroud)

而我需要的是类似的东西

printenum(OS_type, "My OS is %s", myOS);
Run Code Online (Sandbox Code Playgroud)

必须显示字符串"Linux",而不是整数.

我想,首先我必须创建一个值索引的字符串数组.但我不知道这是否是最美妙的方式.有可能吗?

c c++ preprocessor ansi-c

110
推荐指数
12
解决办法
18万
查看次数

为什么ANSI C没有命名空间?

对于大多数语言来说,拥有名称空间似乎是明智之举.但据我所知,ANSI C不支持它.为什么不?有计划将其纳入未来的标准吗?

c namespaces ansi-c

82
推荐指数
7
解决办法
6万
查看次数

字符串终止 - char c = 0 vs char c ='\ 0'

在终止字符串时,在我看来逻辑上char c=0等同于char c='\0',因为"null"(ASCII 0)字节是0,但通常人们倾向于这样做'\0'.这纯粹是出于偏好还是应该是一个更好的"实践"?

什么是首选?


编辑: K&R :"字符常量'\0'表示值为零的字符,空字符.'\0'经常编写而不是0强调某些表达式的字符性质,但数值只是0.

c string c-strings null-terminated ansi-c

45
推荐指数
3
解决办法
9万
查看次数

ANSI-C中的静态意味着什么

可能重复:
C程序中"静态"是什么意思?

static关键字在C 中的含义是什么?

我正在使用ANSI-C.我在几个代码示例中看到,它们static在变量前面和函数前面使用关键字.使用变量的目的是什么?使用函数的目的是什么?

c static keyword ansi-c

33
推荐指数
2
解决办法
4万
查看次数

ANSI C与其他C标准

在我使用的几个编译器(gcc除了各种版本之外的所有版本)中,我得到一个C99 mode错误,例如int i在for循环表达式中而不是在它之前声明(如果我不使用该std=c99选项).在这里阅读之后,我理解gcc选项-ansi,-std=c89并且-std=iso9899:1990都评估为ANSI C标准,但我不明白为什么/如果我应该选择c89标准而不是更新的标准c99(这是我假设的最新标准).

此外,我看到isoC语言的类型标准的多个版本,其中第一个(根据我的理解)是ANSI标准的直接端口. 是否可以肯定地说iso将更新他们的C标准,但C的原始ANSI标准将始终是相同的?

奖金问题:

我实际上可以自己弄清楚这一点,我还没有花时间去做,所以如果有人知道他们的头顶那么这很好,否则没什么大不了的,我以后会搞清楚的:)

我有一本相当新的书The C Programming Language (ANSI).我的书总是显示像这样的循环:

int i;

for(i = 0; i < foo; i++)
Run Code Online (Sandbox Code Playgroud)

但很多人(他们的小指中有大多数编程才能)都会像这样编写for循环:

(int i = 0; i < foo; i++)
Run Code Online (Sandbox Code Playgroud)

如果我以第一种方式编写循环然后i应该可以访问整个函数是正确的,但是如果我以第二种方式编写它,那么i只能访问for循环REGARDLESS我编译的标准是什么?另一种问同样问题的方法,如果我使用c89标准进行编译,那么ifor循环的两个for循环都可以被整个函数访问,如果我使用c99标准进行编译,i那么整个函数可以访问第一个for循环i.第二个for循环只能通过for循环访问?

c gcc ansi-c

30
推荐指数
2
解决办法
2万
查看次数

谁定义了C运算符优先级和关联性?

介绍

在C/C++的每本教科书中,您都可以找到运算符优先级和关联表,如下所示:

运算符优先级和关联表

http://en.cppreference.com/w/cpp/language/operator_precedence

StackOverflow上的一个问题是这样的:

以下函数的执行顺序如下:

f1() * f2() + f3();
f1() + f2() * f3();

参考上面的图表,我自信地回答说函数具有从左到右的关联性,因此在前面的语句中,在这两种情况下都会像这样评估:

f1() - > f2() - > f3()

评估函数后,您完成评估,如下所示:

(a1*a2)+ a3
a1 +(a2*a3)

令我惊讶的是,很多人告诉我,我错了.决心证明他们错了,我决定转向ANSI C11标准.我再一次惊讶地发现在运算符优先级和关联性方面提到的很少.

问题

  1. 如果我认为函数总是从左到右进行评估是错误的,那么表中涉及函数优先级和关联性的真正含义是什么?
  2. 谁定义了运算符优先级和关联性,如果它不是ANSI?如果是ANSI的定义,为什么很少提到运算符优先级和关联性?运算符优先级和关联性是从ANSI C标准推断还是在数学中定义?

c c++ operator-precedence associativity ansi-c

26
推荐指数
3
解决办法
8249
查看次数

ANSI C相当于try/catch?

我有一些我正在使用的C代码,我在代码运行时发现错误,但是关于如何正确执行try/catch(如C#或C++)的信息很少.

例如在C++中,我只是这样做:

try{
//some stuff
}
catch(...)
{
//handle error
}
Run Code Online (Sandbox Code Playgroud)

但在ANSI C中,我有点迷失.我尝试了一些在线搜索,但是我没有看到关于如何实现这一点的足够信息/想象我会问这里以防万一有人能指出我正确的方向.

这是我正在使用的代码(相当简单,递归的方法),并希望用try/catch(或等效的错误处理结构)进行包装.

但是我的主要问题是如何在ANSI C中执行try/catch ...实现/示例不必是递归的.

void getInfo( int offset, myfile::MyItem * item )
{
    ll::String myOtherInfo = item->getOtherInfo();
    if( myOtherInfo.isNull() )
        myOtherInfo = "";
    ll::String getOne = "";
    myfile::Abc * abc = item->getOrig();
    if( abc != NULL )
    {
        getOne = abc->getOne();
    }
    for( int i = 0 ; i < offset ; i++ )
    {
             printf("found: %d", i);
    }
    if( abc != NULL )
        abc->release();
    int childCount …
Run Code Online (Sandbox Code Playgroud)

c c++ exception-handling try-catch ansi-c

25
推荐指数
2
解决办法
9332
查看次数

为一切而开 - 这可能吗?

我以前编程窗口,但我想尝试制作跨平台应用程序.我有一些问题,如果你不介意:

问题1

有没有办法打开UNICODE\ASCII文件并使用裸ANSI C自动检测它的编码.MSDN说如果我将使用fopen()可以在各种UNICODE格式(utf-8,utf-16,UNICODE BI\LI)之间切换"ccs = UNICODE"标志.通过实验发现,从UNICODE切换到ASCII没有发生,但试图解决这个问题,我发现文本Unicode文件有一些前缀,如0xFFFE,0xFEFF或0xFEBB.

FILE *file;
{
 __int16 isUni;
 file = _tfopen(filename, _T("rb"));
 fread(&(isUni),1,2,file);
 fclose(file);
 if( isUni == (__int16)0xFFFE || isUni == (__int16)0xFEFF || isUni == (__int16)0xFEBB)
  file = _tfopen(filename, _T("r,ccs=UNICODE"));
 else
  file = _tfopen(filename, _T("r"));         
}
Run Code Online (Sandbox Code Playgroud)

那么,我可以制作这样的跨平台而不是那么难看的东西吗?

问题2

我可以在Windows中做这样的事情,但它能在Linux下运行吗?

file = fopen(filename, "r");
fwscanf(file,"%lf",buffer);
Run Code Online (Sandbox Code Playgroud)

如果没有,那么是否有某种ANSI C函数将ASCII字符串转换为Unicode?我想在我的程序中使用Unicode字符串.

问题3

此外,我需要将Unicode字符串输出到控制台.在windows中有setlocale(*),但我应该在Linux中做什么?似乎控制台已经是Unicode了.

问题4

一般来说,我想在我的程序中使用Unicode,但是我遇到了一些奇怪的问题:

f = fopen("inc.txt","rt");
fwprintf(f,L"?????");            // converted successfully
fclose(f);
f = fopen("inc_u8.txt","rt, ccs = UNICODE");
fprintf(f,"text");               // failed to convert
fclose(f);
Run Code Online (Sandbox Code Playgroud)

PS有没有关于跨平台编程的好书,有什么比较windows和linux程序代码?还有一些关于使用Unicode的方法,实用方法,即.我不想沉浸在简单的UNICODE BI\LI历史中,我对特定的C/C++库感兴趣.

c unicode console cross-platform ansi-c

24
推荐指数
1
解决办法
4976
查看次数

char*var之间的区别; 和char*var;?

只是想知道之间是否有任何区别:

char* var;
char *var;
Run Code Online (Sandbox Code Playgroud)

或者它只是一个偏好(间距)的问题?

c pointers ansi-c

21
推荐指数
1
解决办法
9102
查看次数