标签: c++98

为什么 -std=c++98 标志有时不起作用?

情况如下:

我想创建一个简单的c++程序,但它只能使用C ++98函数。
我在用Ubuntu 20.04.4 LTS
我正在使用c++编译器,
我使用以下标志进行编译: -Wall -Werror -Wextra -std=c++98 -pedantic-errors

stoi()现在,如果我使用来自 的函数<string>,编译将会失败,正如预期的那样,因为它是 C++11,正如您在此处stoi()看到的。


但这里出现了我无法理解的奇怪行为:
使用roundroundffrom<cmath>不会触发该-std=c++98标志,尽管从我在这里看到的所有round函数都是 C++11 的。

为什么会发生这种情况有什么好的解释吗?


编辑:
正如jjramsey提到的,有可能round使用了标准 C 函数,因此该-std=c++98标志对此没有影响。谁能证实这个理论?

c++ c++98

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

测试某些内容是否是对其他内容的引用

假设我有:

  std::vector<Foo> v1;
  std::vector<Foo> v2;
  std::vector<Foo>& rV = v1;
Run Code Online (Sandbox Code Playgroud)

我该怎么做这样的测试:

  TEST_EQ(v1, rV);
  TEST_NOT_EQ(v2, rV);
Run Code Online (Sandbox Code Playgroud)

我认为对于那些对您的代码进行单元测试的人来说,这是一个常见的问题.

c++ boost c++98

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

std :: string到uint64_t

如何将a转换std::stringuint64_t?如果字符串不包含一个纯粹的表示形式,我也希望抛出该函数uint64_t.例如,这些转换应抛出:

"NO: 9889"
"9889L"
"9889U"
"1e+22"
Run Code Online (Sandbox Code Playgroud)

或用另一种方式表明它们不是纯粹的代表.我正在使用C++ 98和boost(包括boost::regex).

c++ boost c++98

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

将成员复制到std :: vector

struct Node
{
    std::string name;
    ...
};

typedef std::vector<Node> Nodes;

Nodes nodes;
std::vector<std::string> names;
Run Code Online (Sandbox Code Playgroud)

对于节点中的每个项目,是否有一个很好的单行方式用Node :: name填充矢量名称?

这就是我目前所做的事情:

names.reserve(nodes.size());
BOOST_FOREACH(Node node, nodes) 
{
    names.push_back(node.name);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用C++ 98,std和boost.

c++ boost std c++98

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

如何在C++ 11/98中使用<functional>跳过参数

说我有一个功能:

void function() {
    cout << "Hello!" << endl;
}
Run Code Online (Sandbox Code Playgroud)

我有一个算法调用一个函数并传递两个参数:

template <class F>
void my_algorithm(F f) {
    // ...
    f(x, y);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如何通过操作函数或函数对象function来传递my_algorithm,而无需手动创建包装器?作为参考,我不想创建的包装器看起来像这样:

void functionSkipArgs(A a, B b) {
    function();
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我想找到some_operations与以下代码对应的函数或函数系列:

my_algorithm(some_operations(&function));
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++98

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

在C89和C++中用空参数调用宏真的是未定义的行为吗?

考虑以下计划:

#include <iostream>
#define add(s,m,a)  ( s + m + a + 0 )
int main()
{
    std::cout<<add(3,4,5)<<'\n';
    std::cout<<add(15,30,)<<'\n';
    std::cout<<add(10, , 33)<<'\n';
    std::cout<<add(10,,)<<'\n';
    std::cout<<add(,,)<<'\n';   
}
Run Code Online (Sandbox Code Playgroud)

我的编译器gcc 4.8.1给出以下警告:

6   23 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

7   25 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]

8   21 [Warning] invoking macro add argument 2: empty …
Run Code Online (Sandbox Code Playgroud)

c c++ macros c89 c++98

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

使用指针的合法遗留代码突然变为UB

假设我们有来自C++ 98的遗留代码:

bool expensiveCheck();

struct Foo;

bool someFunc()
{
    Foo *ptr = 0;
    if( expensiveCheck() )
        ptr = new Foo;

    // doing something irrelevant here
    ...
    if( ptr ) {
        // using foo
    }
    delete ptr;
    return ptr; // here we have UB(Undefined Behavior) in C++11
}
Run Code Online (Sandbox Code Playgroud)

所以基本上这里的指针用于保持动态分配的数据并同时将其用作标志.对我来说它是可读代码,我相信它是合法的C++ 98代码.现在根据这个问题:

删除后在c ++中的指针

删除后指针本身会发生什么?

这段代码在C++ 11中有UB.这是真的吗?

如果是,请记住另一个问题,我听说委员会付出了巨大努力,不破坏新标准中的现有代码.如果我在这种情况下没有弄错,这不是真的.是什么原因?这样的代码是否已经被认为是有害的,所以没有人关心它会被打破?他们没有考虑后果?这种优化是如此重要?别的什么?

c++ language-lawyer c++11 c++98

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

在C++ 98中写一个单独的字符串来cout"线程安全"

我知道在C++ 98中严格说来没有什么是线程安全的,因为在标准中,在C++ 11之前没有线程.但是,在实践中,早在C++ 11之前就已经在C++中使用了线程.

所以让我们两个pthreads同时称之为:

void printSomething(){
    std::cout << "something\n";
}
Run Code Online (Sandbox Code Playgroud)

什么可以导致两个输出交错?或者我会在实践中总是两行包含"某些东西"吗?

我问这个是因为这个问题让我很惊讶,我发现这个答案说明:

...在C++ 11中,std :: cout是线程安全的.

这个答案提供了一个例子

std::cout << "aaaaaaaaaa" << "bbbbbbbbbb";
Run Code Online (Sandbox Code Playgroud)

并得出结论,在C++ 98中,执行此操作的两个线程可能具有交错输出,但我找不到任何关于两个线程operator<<只调用一次的内容.

c++ multithreading c++98

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

为什么在SFINAE期间需要参数中的指针?

为什么我需要在线*上制作checker指针

template <typename C> static yes test( checker<C, &C::helloworld>* );

为了使编译时间扣除正常工作,输出1 0

当我删除时*,输出是0 0

#include <iostream>

struct Generic {}; 
struct Hello
{ int helloworld() { return 0; } };

// SFINAE test
template <typename T>
class has_helloworld
{
    typedef char                yes;
    typedef struct {char _[2];}  no; 

    template <typename C, int (C::*)()> struct checker;

    template <typename C> static yes test( checker<C, &C::helloworld>* );
    template <typename C> static no  test(...);

public:
    enum { …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae c++03 c++98

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

当数据存储为uint8_t的向量时如何传递“ char *数据”?

我有一个这样定义的类:

class sco
{
private:

public:
    vector<uint8_t> data;

    sco(vector<uint8_t> data);
    ~sco();

};
Run Code Online (Sandbox Code Playgroud)

构造函数在哪里:

sco::sco(vector<uint8_t> data) {       
    this->data = data;
}
Run Code Online (Sandbox Code Playgroud)

然后,我有一个这样声明的函数:

void send(unsigned& id, char* data, char len);
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要将sco成员的数据传递给它,但是类型和指针的区别使我感到困惑。如果我有一个newSco成员,其中包含一些数据,将这个send函数调用为send(someId, (char*)&(newSco.data.begin()), newSco.data.size() );吗?请注意,函数send是针对微控制器的,它采用char类型,因此我无法更改它,也不能更改uint8_t,因为这是来自串行通信的类型。我已经浪费了超过三天的时间,试图将类型转换为相互的东西,只是为了将其反向,因为它破坏了一切。我放弃了,我将不再尝试操纵类型,因为我只是没有时间,即使是不好的做法也只需要它来工作。我以为uint8_t和char大小相同,所以没关系。

c++ c++98 mbed

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

标签 统计

c++ ×10

c++98 ×10

boost ×3

c++11 ×2

c ×1

c++03 ×1

c89 ×1

language-lawyer ×1

macros ×1

mbed ×1

multithreading ×1

sfinae ×1

std ×1

templates ×1