更新:我现在重新测试了简化的测试用例和恢复共享名称的完整代码,并且它可以正常工作。我的代码中的其他地方可能还有一些其他错误,现在已修复。抱歉浪费了您的时间和精力;将来永远不会在没有工作测试用例的情况下发布。我的罪过。
我有一个我反复调用的 C++ 函数。它有以下片段
switch(c)
{
case 1:
{
static int i = 0;
if ( ... ) { i = 0; }
....
break;
}
case 2:
{
static int i = 0;
if ( ... ) { i = 0; }
....
break;
}
case 3:
{
static int i = 0;
if ( ... ) { i = 0; }
....
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是它必须记住每个案例的状态,有时它必须重置它。
它没有正常工作。当我调试它(MSVC++ 2010 Express Edition)时,我注意到每个i人的行为都不是独立的,他们的值似乎在自己改变;此外,当重设条件被击中时,相应的if输入 OK 但 …
我一直在努力理解以下行为:
#include <iostream>
#include <cstdlib>
using namespace std;
struct A
{
void operator delete[](void *p)
{
cout << "delete\n";
::operator delete[](p);
}
void operator delete[](void *p, size_t t)
{
cout << "delete with two arguments\n";
::operator delete[](p);
}
};
int main()
{
A *a = new A[5];
delete [] a;
}
Run Code Online (Sandbox Code Playgroud)
在示例中,调用具有一个参数的非放置释放函数.但是5.3.6/10 N3797 C++ 14工作草案说:
如果类型完成并且如果解除分配函数查找同时发现仅具有指针参数的通常释放函数和具有指针参数和大小参数的通常释放函数,则所选择的释放函数应该是 具有两个参数的函数.
这是一个错误吗?
我维护strncpy了一大堆仍然使用很多的遗留代码.我现在开始strncpy用它的安全对应物替换使用的过程strncpy_s.我注意到这strncpy_s是用-2值填充目标缓冲区 - 但仅在调试版本中!在发布版本中,不会发生填充.
例如:
char buffer[3];
// buffer becomes 00000000 00000000 00000000
memset(buffer, 0, sizeof(buffer));
// buffer becomes 01100001 00000000 11111110
// 97 ('a') 0 -2
strncpy_s(buffer, sizeof(buffer), "a", _TRUNCATE);
// i is -2
int i = buffer[2];
Run Code Online (Sandbox Code Playgroud)
在MSDN文档不提这个填充行为,在我的情况下,它是真正的东西,我不想因为我的遗留代码依赖于一个事实,即缓冲区的归零部分保持零和字符串复制过程中不会被覆盖.
有没有办法阻止strncpy_s在调试版本中填充目标字符串?
请注意,我已使用Visual Studio 2010和Visual Studio 2013对此进行了测试.
#include <stdio.h>
#include <string.h>
int main()
{
char src[]="123456";
strcpy(src, &src[1]);
printf("Final copied string : %s\n", src);
}
Run Code Online (Sandbox Code Playgroud)
当我使用Visual Studio 6编译器时,它给了我预期的答案" 23456".
为什么23556用gcc 4.7.2编译时这个程序打印" " ?
我被赋予了重新实现文本框GUI小部件和类型编写器的严峻任务,因此这是此问题的起源.
目前在我的项目中,新行字符\n保存下一行(column1,line + 1)上最终第一个字符的位置坐标.但是,我担心这不是对换行位置的标准理解.
新行字符是否与\n前一个字符在同一行中,它是下一行的一部分(因为它在我当前的方法中)或者它们都不是?
我在使用退格键删除新行时遇到了复杂问题,因为我必须为此事件实现特定条件,但我试图避免这种情况(或者可以通过更改处理新行字符的方式来避免),因为从所有这些条件来看,我看起来正在尝试发明AI或其他东西.
我正在阅读Brian W. Kernighan和Dennis M. Ritchie的" C编程语言 ".在第1.2章"变量和算术表达式"中,他们演示了一个简单的华氏温度到摄氏温度转换器程序.当我编译程序(Terminal.app,macOS Sierra)时,我收到此警告:
$ cc FtoC.c -o FtoC.o
FtoC.c:5:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main()
^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)
这是C程序:
FtoC.c:
1 #include <stdio.h>
2
3 /* print Fahrenheit-Celsius table
4 for fahr = 0, 20, ..., 300 */
5 main()
6 {
7 int fahr, celsius;
8 int lower, upper, step;
9
10 lower = 0; /* lower limit of temperature scale */
11 upper = 300; /* upper limit */ …Run Code Online (Sandbox Code Playgroud) 当我编写以下代码时,我得到了预期的错误error: array size missing in 'data'。
int main()
{
unsigned char data[];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行相同的代码但将违规行包装在 a 中时struct,没有错误。
typedef struct credit_card_s
{
unsigned char is_valid;
unsigned char data[];
} credit_card_t;
Run Code Online (Sandbox Code Playgroud)
谁能向我解释为什么允许这样做?
可能重复:
我在哪里可以找到当前的C或C++标准文档?
我有几本C书,其中一本是C by Discovery,很好地解释了这门语言.但到目前为止,我似乎无法完整地找到完整的C/C++语言和库标准以及函数,类型等列表.
C99的完全标准在哪里以及C语言标准,C++语言标准及其库中较旧的,通常更常用和可接受的标准?
是否有一些我必须支付的费用,或者我应该遵循像GCC那样的维基百科和文档?
我还应该去哪里下载或完全获取它们?
当在STL中第一个== last时,是否有针对container.erase(first,last)的定义行为,还是未定义?
例:
std::vector<int> v(1,1);
v.erase(v.begin(),v.begin());
std::cout << v.size(); // 1 or 0?
Run Code Online (Sandbox Code Playgroud)
如果有一个标准库规范文档有这些信息,我将不胜感激.