看下面的例子.C++标准是否保证最终的值object.x等于1?如果我不调用析构函数object.~Class();怎么办?
#include <new>
class Class
{
public:
Class() {}
~Class() {}
int x;
};
int main()
{
Class object;
object.x = 1;
object.~Class();
new (&object) Class();
object.x == ?
Class object_2;
object_2.x = 1;
new (&object_2) Class();
object_2.x == ?
return 0;
}
Run Code Online (Sandbox Code Playgroud) 例如,node::node()以下代码段中的构造函数访问全局变量node::count而::tail没有任何多线程保护.C++标准是否保证输出始终是0 1 2(无论顺序如何)的排列?
#include <stdio.h>
struct node *tail;
struct node
{
static int count;
int index;
node *prev;
node()
{ index = count++; prev = tail; tail = this; }
};
int node::count;
node one, two[2];
int main(int argc, char *argv[])
{
for(node *p = tail; p; p = p->prev)
printf("%d\n", p->index);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找基于(适用)标准的答案,而不是针对实现或编译器特定行为.有许多对SO有关的问题,但它不是完全清楚他们是如何直接适用于这个特定的和相当基本情况(是C++中的静态成员变量的初始化是线程安全的?,是本地静态变量的初始化线程安全的C++ 11 ?等).
我有这个简单的 hello world C++ 应用程序:
#include <windows.h>
#include <iostream>
using namespace std;
void test()
{
cout << "Hello world" << endl;
}
Run Code Online (Sandbox Code Playgroud)
我想用作test我的自定义入口点。到目前为止,我尝试设置Linker -> Advanced -> Entrypoint为test但我收到很多 lnk2001 错误。是否可以以某种方式删除任何 main() wmain() WinMain() 并仅通过 Visual studio 设置使用我的函数?
我正在处理的代码使用一些非常复杂的宏voodoo来生成代码,但最后有一个看起来像这样的构造
#define ARGS 1,2,3
#define MACROFUNC_OUTER(PARAMS) MACROFUNC_INNER(PARAMS)
#define MACROFUNC_INNER(A,B,C) A + B + C
int a = MACROFUNC_OUTER(ARGS);
Run Code Online (Sandbox Code Playgroud)
期待的是获得
int a = 1 + 2 + 3;
Run Code Online (Sandbox Code Playgroud)
这适用于最初为GHS编写的编译器以及GCC编写的编译器,但MSVC(2008)认为PARAMS它不会扩展为单个预处理令牌,然后A将其设置为整体PARAM,B而C不是任何内容.结果就是这样
int a = 1,2,3 + + ;
Run Code Online (Sandbox Code Playgroud)
虽然MSVC警告说not enough actual parameters for macro 'MACROFUNC_INNER'.
(问题最初是由这个答案中的评论引起的.这个生产者 - 消费者实现中是否存在竞争条件?但是这里严格地从C语言角度提出这个问题,没有涉及任何并发或多线程.)
考虑这个最小的代码:
#define BUFSIZ 10
char buf[BUFSIZ];
void f(int *pn)
{
buf[*pn]++;
*pn = (*pn + 1) % BUFSIZ;
}
int main()
{
int n = 0;
f(&n);
return n;
}
Run Code Online (Sandbox Code Playgroud)
问题:C "as-if"规则是否允许编译器重写代码如下?
void f(int *pn)
{
int n = *pn;
*pn = (*pn + 1) % BUFSIZ;
buf[n]++;
}
Run Code Online (Sandbox Code Playgroud)
一方面,上述内容不会改变程序的可观察行为.
另一方面,f可能使用无效索引调用,可能来自另一个翻译单元:
int g()
{
int n = -1001;
f(&n);
}
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,代码的两种变体在访问越界数组元素时都会调用UB.但是,原始代码将保留*pn传入的值f(= -1001),而重写的代码只有在修改*pn(to 0)后才会进入UB-land .
这样的差异是否会被视为"可观察",或者回到实际问题,C标准中是否有任何内容可以特别允许或排除这种类型的代码重写/优化?
我正在学习 TMS320C55x 中的反正切实现,这是源代码:
;* AR0 assigned to _x
;* AR1 assigned to _r
;* T0 assigned to _nx
PSH T3
|| BSET FRCT ;fractional mode
SUB #1, T0 ;nx-1
MOV T0, BRC0 ;repeat nx times
MOV #2596 << #16, AC3 ; AC3.Hi = C5
MOV #-9464 << #16, AC1 ; AC1.Hi = C3
MOV #32617 << #16, AC2 ; AC2.Hi = C1
*
* Note: loading T3 on the instruction before a multiply that uses it will
* cause a …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个小脚本来替换 Windows 路径中的值。使用一些 sed 来替换它很好(我有正确的变量):
echo %path% | sed "s/jvms\\[^^\]\+/jvms\\%1/"
Run Code Online (Sandbox Code Playgroud)
这工作正常。但是,我想将它分配给一个新的路径变量。这样做的方法应该是
for /f "delims=" %%B in ('echo %path% ^| sed "s/windows/C64/"' ) do call set replaced=%%B
echo %replaced%
Run Code Online (Sandbox Code Playgroud)
请注意 | 应该逃脱。但是,新replaced变量将所有分号都替换为空格。因此,输出echo %replaced%类似于c:\C64 c:\program files c:\otherdirectory而不是c:\C64;c:\program files;c:\otherdirectory
当我不使用任何 sed 时,这已经发生了,所以
for /f "delims=" %%B in ('echo %path%' ) do call set replaced=%%B
echo %replaced%
Run Code Online (Sandbox Code Playgroud)
然后返回 c:\Windows c:\program files c:\otherdirectory
如何确保分号不被空格替换?
c++ ×3
c ×2
assembly ×1
batch-file ×1
cmd ×1
entry-point ×1
gcc ×1
macros ×1
math ×1
oop ×1
shell ×1
standards ×1
trigonometry ×1
visual-c++ ×1
winapi ×1
windows ×1