|
4
|
| Blagovest Buyukliev · 技术社区 · 15 年前 |
|
|
1
11
“编译器应该了解printf/sprintf的是它们的原型,而不是它们的语义”。 那是不正确的部分。就标准而言,C实现的任何部分都“被允许”了解任何其他部分,并发布可能对用户有帮助的诊断。编译器内部函数不是标准所要求的,这个特定的诊断也不是,但它们肯定不是禁止的。 请注意(就标准而言)标准库是特殊的,它不仅仅是任何旧的链接库。如果一个特定的实现/编译器甚至为用户提供了一种机制来链接标准库的不同版本,那么当替代库的语义与标准中列出的不同时,标准肯定不要求它“工作”。 因此在这个意义上,标准库中的所有内容都是“bult-ins”。它是C语言规范的一部分。编译器可以在假设其行为符合标准要求的前提下进行操作。
当然,如果直到运行时才知道格式说明符,那么编译器就不能对varargs进行静态检查。但是当编译时知道它时,编译器可以假定
|
|
|
2
2
如果我没看错你的问题,我同意你的假设
|
|
|
3
2
编译器的任务就是给你一些有用的提示。这种行为不在标准范围内。
理论上,没有什么能阻止编译器警告您(可能)不正确地使用QT库。
以及
|
|
|
4
2
该标准要求在某些情况下进行诊断,但不允许进行一般诊断。任何实现都可以出于任何原因(包括不正确地使用
此外,如果包含一个库,其中所有可见的标识符都将被保留。不允许你这样做
|
|
|
5
1
这些警告指示可能的错误,因此非常有用。
我是说,并不是每个人都用自己的libc替换libc,用不同的printf语义。。。 |
|
|
6
1
编程语言标准的最终目的是帮助程序员编写按预期运行的程序。标准中没有规定编译器在遇到“bigvar=byte3<<24+byte2<<16+byte1<<8+byte0;”时应发出警告,但由于结果可能不是程序员想要的,因此许多编译器都会发出警告。这些标准对警告的唯一限制是,它们不能阻止合法程序的成功编译(例如,一个编译器在输出999个警告后出现错误而失败,或者输出如此多的警告,以至于编译在所有实际用途中永远不会完成,这将是不一致的)。 如果 |
|
|
George S. · 是否存在基于元组的控制流语句内部表示? 8 年前 |
|
FlatAssembler · 在x86程序集中计算exp(x) 8 年前 |
|
|
cib · 即时编译和动态编译有什么区别? 8 年前 |
|
|
Artemis · 寄存器与指令之间的差异 8 年前 |
|
|
Sam · 了解go工具编译和链接命令 8 年前 |