小编onq*_*tam的帖子

将所有源文件一次传递给编译器有什么好处吗?

我读过"整个程序优化"(wpo)和"链接时间代码生成"(ltcg).

我想知道如果我一次性将所有源代码从cli传递给编译器(例如"g ++ a.cpp b.cpp"),是否会有更多的模块间分析?或者只是要启用其中一个标志?

编译器之间有区别吗?例如,英特尔编译器可以从这种做法中受益,而其他编译器却没有吗?

compiler-construction gcc clang icc visual-c++

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

宏后如何要求使用分号

因此,我正在编写一个必须使用-pedantic -ansi -std=c++98 -Werror和建立的库-Weverything用于铛和-Wall -WextraGCC和我有这个宏TESTSUITE(X)其目的是在全球范围内使用这样的:

TESTSUITE(current testsuite);
Run Code Online (Sandbox Code Playgroud)

它的作用是使用字符串调用一个函数(在程序启动时通过初始化哑变量):

#define TESTSUITE(name) \
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name)
Run Code Online (Sandbox Code Playgroud)

问题在于,这会在clang下为生成警告-Wglobal-constructors

如果我这样包围它_Pragma

#define TESTSUITE(name)                                              \
_Pragma("clang diagnostic push");                                    \
_Pragma("clang diagnostic ignored \"-Wglobal-constructors\"");       \
static int ANONYMOUS_VARIABLE(SOME_PREFIX) = setTestSuiteName(#name) \
_Pragma("clang diagnostic pop")
Run Code Online (Sandbox Code Playgroud)

使用宏后的分号将不需要进行编译(以及丢失时) -pedantic出现错误)。

如果我在宏末尾添加

static int ANONYMOUS_VARIABLE(SOME_PREFIX) = 5
Run Code Online (Sandbox Code Playgroud)

需要使用分号,但我会收到一个警告,提示我一个无法使用的未使用变量(因为如果用 _Pragma语句将其我将回到不需要分号的平方1)。

那么,有谁知道我该如何要求分号并同时显示0条警告?

c++ compiler-warnings suppress-warnings c-preprocessor

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

替代do {} while(false)的宏

这是代码:

#define myMacro()   \
    {               \
        macro stuff \
    } ((void)0)
Run Code Online (Sandbox Code Playgroud)

这不比do {} while(false)构造更好吗?没有分支,编译时间应该更快 - 并且仍然一切都是作用域的,它后面需要一个分号 - 对我来说似乎很完美!

那么有什么缺点或者这是否真的优于/同时?

c++

2
推荐指数
1
解决办法
271
查看次数

预处理器出现问题 - 将"name"和"="连接为标记时

这是代码:

#define STR_CONCAT_IMPL(s1, s2) s1##s2
#define STR_CONCAT(s1, s2) STR_CONCAT_IMPL(s1, s2)
#define TOSTR_IMPL(x) #x
#define TOSTR(x) TOSTR_IMPL(x)
#define STR_CONCAT_TOSTR(s1, s2) TOSTR(STR_CONCAT(s1, s2))

int main() {
    const char* a = STR_CONCAT_TOSTR(name, p); // works
    const char* b = STR_CONCAT_TOSTR(name, =); // doesn't work
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要一个字符串像"name=""name"在编译时(运行时并置不是一个选项),所以我试图用我的旧宏,但我得到这个错误:

error: pasting "name" and "=" does not give a valid preprocessing token
Run Code Online (Sandbox Code Playgroud)

但是当不使用=但是正常的角色时 - 它有效.

我怎样才能让它发挥作用?

需要C++ 98 GCC/MSVC解决方案.

c++ c-preprocessor

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

如何在C++ 11中获取指针的类型

我有以下内容:

type* ptr;
Run Code Online (Sandbox Code Playgroud)

我想type离开ptr.我尝试使用declval/ declval/ decay但无法让它工作(这就是当你对你正在做的事情没有深刻理解时会发生什么).

那么我怎样才能获得类型并创建相同类型的变量 - 比如 type some_var;

c++ c++11

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

不理解左值的双重转发 - 当通过值传递时

#include <iostream>
#include <vector>
#include <type_traits>
#include <utility>

using namespace std;

template <typename Func, typename... Args>
void proxy(Func f, Args&&... args) {
    f(std::forward<Args>(args)...);
}

void real_func(vector<int> v) {
    cout << "size: " << v.size() << endl;
}

void multicast_func(vector<int> v) {
    proxy(real_func, std::forward<vector<int>>(v));
    proxy(real_func, std::forward<vector<int>>(v));
}

int main()
{
    vector<int> ints = {1, 2, 3};
    multicast_func(ints);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

size: 3
size: 0
Run Code Online (Sandbox Code Playgroud)

为什么不是3,3?这个左值在什么时候变成右值并被移动?

c++ rvalue-reference perfect-forwarding c++11

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

如何从对象内部的typedef获取模板参数类型

我有以下内容:

template<typename T>
struct foo {
    typedef T type;
};

foo<int> real;
foo<int>& a = real;
Run Code Online (Sandbox Code Playgroud)

我希望得到模板类型a- 这可能吗?我尝试过以下方法:

a.type b;
decltype(a.type) c;
a::type c;
decltype(a::type) d;
Run Code Online (Sandbox Code Playgroud)

但它们都不起作用......

c++ templates c++11

0
推荐指数
1
解决办法
116
查看次数

variadic macro - 可选的初始化表达式

我想要一个macro声明int一个给定名称和可选的初始化表达式.

我尝试在Stack Overflow上使用这个答案,但没有成功.

这是我试过的:

#define macro(...) int FIRST(__VA_ARGS__)(REST(__VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)

这样使用时没有问题:

macro(foo);
Run Code Online (Sandbox Code Playgroud)

但是当给出初始化器时会出现错误:

macro(foo, 42);
Run Code Online (Sandbox Code Playgroud)

另一种 - 只是使用时会在没有参数的情况下__VA_ARGS__-pedanticGCC 发出警告.

我怎样才能解决这个问题?

()当没有初始化表达式时,是否也可以避免括号 - 这意味着没有零初始化但是默认?

请注意,我的真实用例不仅适用int于任何类型,而且使用像boost这样的第三方也不是一种选择.

c++ c-preprocessor variadic-macros c++11

0
推荐指数
1
解决办法
131
查看次数