我读过"整个程序优化"(wpo)和"链接时间代码生成"(ltcg).
我想知道如果我一次性将所有源代码从cli传递给编译器(例如"g ++ a.cpp b.cpp"),是否会有更多的模块间分析?或者只是要启用其中一个标志?
编译器之间有区别吗?例如,英特尔编译器可以从这种做法中受益,而其他编译器却没有吗?
因此,我正在编写一个必须使用-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条警告?
这是代码:
#define myMacro() \
{ \
macro stuff \
} ((void)0)
Run Code Online (Sandbox Code Playgroud)
这不比do {} while(false)构造更好吗?没有分支,编译时间应该更快 - 并且仍然一切都是作用域的,它后面需要一个分号 - 对我来说似乎很完美!
那么有什么缺点或者这是否真的优于/同时?
这是代码:
#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解决方案.
我有以下内容:
type* ptr;
Run Code Online (Sandbox Code Playgroud)
我想type离开ptr.我尝试使用declval/ declval/ decay但无法让它工作(这就是当你对你正在做的事情没有深刻理解时会发生什么).
那么我怎样才能获得类型并创建相同类型的变量 - 比如 type some_var;
#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?这个左值在什么时候变成右值并被移动?
我有以下内容:
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)
但它们都不起作用......
我想要一个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这样的第三方也不是一种选择.