我一直在阅读关于C99和C++ 11以及所有这些非常甜蜜的东西,它们被添加到语言标准中,有一天可能会很好用.但是,我们目前正处于在Visual Studio中编写C++的过程中.
标准中的任何新东西是否会被添加到visual studio中,或者微软是否更有兴趣添加新的C#变体来做到这一点?
编辑:除了接受的答案,我找到了Visual C++团队博客:
具体来说,这篇文章在其中:
http://blogs.msdn.com/vcblog/archive/2008/02/22/tr1-slide-decks.aspx
很有用.谢谢!
使用%p转换说明符打印空指针是不确定的行为?
#include <stdio.h>
int main(void) {
void *p = NULL;
printf("%p", p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个问题适用于C标准,而不适用于C实现.
当我尝试构建此代码时
inline void f() {}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
使用命令行
gcc -std=c99 -o a a.c
Run Code Online (Sandbox Code Playgroud)
我收到链接器错误(未定义引用f).如果我使用static inline或extern inline代替just inline,或者如果我使用-O(因此函数实际内联),则错误消失.
这种行为似乎在C99标准第6.7.4(6)段中定义:
如果转换单元中函数的所有文件范围声明都包含
inline函数说明符extern,则该转换单元中的定义是内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.
如果我理解了这一切,inline那么如果还有一个具有相同名称的外部函数,那么具有上例中定义的函数的编译单元只会一致地编译,而且我永远不知道我自己的函数或外部函数是否被调用.
这种行为不是完全愚蠢吗?在inline没有static或extern在C99中定义函数是否有用?我错过了什么吗?
当然我错过了什么,行为并不愚蠢.:)
正如Nemo所解释的那样,我们的想法是定义函数
inline void f() {}
Run Code Online (Sandbox Code Playgroud)
在头文件中只有一个声明
extern inline void f();
Run Code Online (Sandbox Code Playgroud)
在相应的.c文件中.只有extern声明才会触发生成外部可见的二进制代码.确实没有inline在.c文件中使用 - 它只在标题中有用.
正如Jonathan的回答中引用的C99委员会的基本原理所阐述的那样,inline所有关于编译器优化都需要在调用的站点上看到函数的定义.这只能通过将标题放在标题中来实现,当然,标题中的定义在编译器每次看到它时都不能发出代码.但由于编译器不是强制实际内联函数,因此必须在某处存在外部定义.
有机器(或编译器),在哪里sizeof(char) != 1?
C99标准是否说sizeof(char)标准合规性实施必须正好1?如果有,请给我部分编号和引文.
更新:
如果我有一台机器(CPU),它不能寻址字节(最小读取是4个字节,对齐),但只有4-s的字节(uint32_t),这个机器的编译器可以定义 sizeof(char)为4吗?sizeof(char)将是1,但char将有32位(CHAR_BIT宏)
Update2: 但是sizeof结果不是BYTES!这是CHAR的大小.char可以是2个字节,或者(可能是)7位?
Update3:
好的.所有机器都有sizeof(char) == 1.但机器有CHAR_BIT > 8什么?
是否有printf宽度说明符可以应用于浮点说明符,该说明符会自动将输出格式化为必要的有效位数,以便在重新扫描字符串时,获取原始浮点值?
例如,假设我打印float到2小数位数的精度:
float foobar = 0.9375;
printf("%.2f", foobar); // prints out 0.94
Run Code Online (Sandbox Code Playgroud)
当我扫描输出时0.94,我没有符合标准的保证我将获得原始的0.9375浮点值(在这个例子中,我可能不会).
我想要一种方法告诉printf自动将浮点值打印到必要的有效位数,以确保它可以扫描回传递给的原始值printf.
我可以使用一些宏float.h来导出要传递的最大宽度printf,但是是否已经有一个说明符可以自动打印到必要的有效位数 - 或者至少是最大宽度?
C99已经存在了10多年,但对它的支持一直很缓慢,因此大多数开发人员都坚持使用C89.即使在今天,当我遇到C代码中的C99功能时,我有时会感到有些惊讶.
现在大多数主要编译器都支持C99(MSVC是一个值得注意的例外,而且一些嵌入式编译器也落后了),我觉得与C合作的开发人员可能应该知道他们可以使用哪些C99功能.一些功能只是之前从未标准化的常见功能(snprintf例如),或者熟悉C++(灵活的变量声明放置或单行//注释),但是一些新功能首先在C99中引入并且是许多程序员都不熟悉.
您在C99中找到了哪些最有用的新功能?
作为参考,C99标准(标记为草案,但据我所知,与更新的标准相同),新功能列表以及GCC C99实施状态.
请回答一个问题; 随时留下多个答案.鼓励展示新功能的简短代码示例.
是否定义了两个非void指针变量(根据C99和/或C++ 98)的差异NULL?
例如,假设我有一个如下所示的缓冲区结构:
struct buf {
char *buf;
char *pwrite;
char *pread;
} ex;
Run Code Online (Sandbox Code Playgroud)
比如说,ex.buf指向一个数组或一些malloc的内存.如果我的代码始终保证pwrite和pread点阵列中或一个过去,然后我相当有信心,ex.pwrite - ex.pread总是被定义.但是,如果pwrite和pread都是NULL.我可以只期望减去两个定义为(ptrdiff_t)0或严格兼容的代码需要测试指针为NULL吗?请注意,我感兴趣的唯一情况是两个指针都是NULL(表示缓冲区未初始化的情况).原因在于满足前面的假设,完全符合"可用"功能:
size_t buf_avail(const struct s_buf *b)
{
return b->pwrite - b->pread;
}
Run Code Online (Sandbox Code Playgroud) 我今天学到了C99和C++中的有向图.以下是有效的计划:
%:include <stdio.h>
%:ifndef BUFSIZE
%:define BUFSIZE 512
%:endif
void copy(char d<::>, const char s<::>, int len)
<%
while (len-- >= 0)
<%
d<:len:> = s<:len:>;
%>
%>
Run Code Online (Sandbox Code Playgroud)
我的问题是:它们为什么存在?
C99标准引入了以下数据类型.可以在此处找到AVR stdint库的文档.
uint8_t 意味着它是一个8位无符号类型.uint_fast8_t 意味着它是最快的无符号整数,至少有8位.uint_least8_t 意味着它是一个至少8位的无符号整数.我理解uint8_t和是什么uint_fast8_t(我不知道它是如何在寄存器级别实现的).
你可以解释一下"它unsigned int至少有8位" 是什么意思吗?
2.How uint_fast8_t和uint_least8_t相比有助于提高效率/代码空间uint8_t?