小编dxi*_*xiv的帖子

在现有对象上使用placement new时,如何定义对象的内容

看下面的例子.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)

c++ oop standards language-lawyer

6
推荐指数
1
解决办法
186
查看次数

是否保证主要的全局初始化程序能够运行单线程?

例如,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 ?等).

c++ multithreading language-lawyer

6
推荐指数
1
解决办法
174
查看次数

为简单应用程序设置自定义入口点

我有这个简单的 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 -> Entrypointtest但我收到很多 lnk2001 错误。是否可以以某种方式删除任何 main() wmain() WinMain() 并仅通过 Visual studio 设置使用我的函数?

c++ configuration winapi entry-point visual-studio

5
推荐指数
1
解决办法
1856
查看次数

宏扩展:与逗号的争论

我正在处理的代码使用一些非常复杂的宏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,BC不是任何内容.结果就是这样

int a = 1,2,3 +  + ;
Run Code Online (Sandbox Code Playgroud)

虽然MSVC警告说not enough actual parameters for macro 'MACROFUNC_INNER'.

  • 是否有可能让MSVC通过一些技巧进行扩展(另一层宏来强制进行第二次扩展,一些很好地放置##或#,......).承认改变构造工作的方式不是一种选择.(即:我可以自己解决问题吗?)
  • C标准对这种角落案例有什么看法?我无法在C11规范中找到明确告诉如何处理包含参数列表的参数的任何内容.(即:我可以与代码的作者争论,他必须再次写它,或者只是MVSC不符合?)

c macros gcc visual-c++ language-lawyer

4
推荐指数
1
解决办法
2197
查看次数

UB"未定义行为"背景下的C"可观察行为"

(问题最初是由这个答案中的评论引起的.这个生产者 - 消费者实现中是否存在竞争条件?但是这里严格地从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标准中是否有任何内容可以特别允许或排除这种类型的代码重写/优化?

c language-lawyer

3
推荐指数
1
解决办法
152
查看次数

TMS320C55X 中的反正切实现

我正在学习 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)

math assembly trigonometry numerical-methods

3
推荐指数
1
解决办法
50
查看次数

为什么 Windows shell 的 for 命令会替换分号?

我正在尝试编写一个小脚本来替换 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

如何确保分号不被空格替换?

windows shell cmd batch-file

3
推荐指数
1
解决办法
82
查看次数