如何让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",而不是整数.
我想,首先我必须创建一个值索引的字符串数组.但我不知道这是否是最美妙的方式.有可能吗?
对于大多数语言来说,拥有名称空间似乎是明智之举.但据我所知,ANSI C不支持它.为什么不?有计划将其纳入未来的标准吗?
在终止字符串时,在我看来逻辑上char c=0等同于char c='\0',因为"null"(ASCII 0)字节是0,但通常人们倾向于这样做'\0'.这纯粹是出于偏好还是应该是一个更好的"实践"?
什么是首选?
编辑: K&R 说:"字符常量'\0'表示值为零的字符,空字符.'\0'经常编写而不是0强调某些表达式的字符性质,但数值只是0.
可能重复:
C程序中"静态"是什么意思?
static关键字在C 中的含义是什么?
我正在使用ANSI-C.我在几个代码示例中看到,它们static在变量前面和函数前面使用关键字.使用变量的目的是什么?使用函数的目的是什么?
在我使用的几个编译器(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/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标准.我再一次惊讶地发现在运算符优先级和关联性方面提到的很少.
我有一些我正在使用的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) 我以前编程窗口,但我想尝试制作跨平台应用程序.我有一些问题,如果你不介意:
问题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++库感兴趣.