情况如下:
我想创建一个简单的c++程序,但它只能使用C ++98函数。
我在用Ubuntu 20.04.4 LTS。
我正在使用c++编译器,
我使用以下标志进行编译:
-Wall -Werror -Wextra -std=c++98 -pedantic-errors
stoi()现在,如果我使用来自 的函数<string>,编译将会失败,正如预期的那样,因为它是 C++11,正如您在此处stoi()看到的。
但这里出现了我无法理解的奇怪行为:
使用round或roundffrom<cmath>不会触发该-std=c++98标志,尽管从我在这里看到的所有round函数都是 C++11 的。
为什么会发生这种情况有什么好的解释吗?
编辑:
正如jjramsey提到的,有可能round使用了标准 C 函数,因此该-std=c++98标志对此没有影响。谁能证实这个理论?
假设我有:
  std::vector<Foo> v1;
  std::vector<Foo> v2;
  std::vector<Foo>& rV = v1;
我该怎么做这样的测试:
  TEST_EQ(v1, rV);
  TEST_NOT_EQ(v2, rV);
我认为对于那些对您的代码进行单元测试的人来说,这是一个常见的问题.
如何将a转换std::string为uint64_t?如果字符串不包含一个纯粹的表示形式,我也希望抛出该函数uint64_t.例如,这些转换应抛出:
"NO: 9889"
"9889L"
"9889U"
"1e+22"
或用另一种方式表明它们不是纯粹的代表.我正在使用C++ 98和boost(包括boost::regex).
struct Node
{
    std::string name;
    ...
};
typedef std::vector<Node> Nodes;
Nodes nodes;
std::vector<std::string> names;
对于节点中的每个项目,是否有一个很好的单行方式用Node :: name填充矢量名称?
这就是我目前所做的事情:
names.reserve(nodes.size());
BOOST_FOREACH(Node node, nodes) 
{
    names.push_back(node.name);
}
我正在使用C++ 98,std和boost.
说我有一个功能:
void function() {
    cout << "Hello!" << endl;
}
我有一个算法调用一个函数并传递两个参数:
template <class F>
void my_algorithm(F f) {
    // ...
    f(x, y);
    // ...
}
如何通过操作函数或函数对象function来传递my_algorithm,而无需手动创建包装器?作为参考,我不想创建的包装器看起来像这样:
void functionSkipArgs(A a, B b) {
    function();
}
换句话说,我想找到some_operations与以下代码对应的函数或函数系列:
my_algorithm(some_operations(&function));
考虑以下计划:
#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';   
}
我的编译器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 …假设我们有来自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
}
所以基本上这里的指针用于保持动态分配的数据并同时将其用作标志.对我来说它是可读代码,我相信它是合法的C++ 98代码.现在根据这个问题:
这段代码在C++ 11中有UB.这是真的吗?
如果是,请记住另一个问题,我听说委员会付出了巨大努力,不破坏新标准中的现有代码.如果我在这种情况下没有弄错,这不是真的.是什么原因?这样的代码是否已经被认为是有害的,所以没有人关心它会被打破?他们没有考虑后果?这种优化是如此重要?别的什么?
我知道在C++ 98中严格说来没有什么是线程安全的,因为在标准中,在C++ 11之前没有线程.但是,在实践中,早在C++ 11之前就已经在C++中使用了线程.
所以让我们两个pthreads同时称之为:
void printSomething(){
    std::cout << "something\n";
}
什么可以导致两个输出交错?或者我会在实践中总是两行包含"某些东西"吗?
...在C++ 11中,std :: cout是线程安全的.
但这个答案提供了一个例子
std::cout << "aaaaaaaaaa" << "bbbbbbbbbb";
并得出结论,在C++ 98中,执行此操作的两个线程可能具有交错输出,但我找不到任何关于两个线程operator<<只调用一次的内容.
为什么我需要在线*上制作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 { …我有一个这样定义的类:
class sco
{
private:
public:
    vector<uint8_t> data;
    sco(vector<uint8_t> data);
    ~sco();
};
构造函数在哪里:
sco::sco(vector<uint8_t> data) {       
    this->data = data;
}
然后,我有一个这样声明的函数:
void send(unsigned& id, char* data, char len);
我的问题是我需要将sco成员的数据传递给它,但是类型和指针的区别使我感到困惑。如果我有一个newSco成员,其中包含一些数据,将这个send函数调用为send(someId, (char*)&(newSco.data.begin()), newSco.data.size() );吗?请注意,函数send是针对微控制器的,它采用char类型,因此我无法更改它,也不能更改uint8_t,因为这是来自串行通信的类型。我已经浪费了超过三天的时间,试图将类型转换为相互的东西,只是为了将其反向,因为它破坏了一切。我放弃了,我将不再尝试操纵类型,因为我只是没有时间,即使是不好的做法也只需要它来工作。我以为uint8_t和char大小相同,所以没关系。