我知道如何禁用所有未知的#pragma警告.答案是,例如,这里:SO:如何禁用#pragma警告?
我的问题是 - 有没有办法禁用一个特定的pragma''unknown pragma'警告?例如,如果我禁用#pragma ugubugu以下代码的警告:
#pragma ugubugu
#pragma untiunti
int main() {return 0;}
Run Code Online (Sandbox Code Playgroud)
用以下任何一个编译时
g++ pragma.cpp -Wall
clang++ pragma.cpp -Wall
Run Code Online (Sandbox Code Playgroud)
应该产生一个警告:
warning: ignoring #pragma untiunti
Run Code Online (Sandbox Code Playgroud)
也许,例如,有一种简单的方法来注册一个什么都不做的自定义编译指示?
很高兴知道是否有这样的选项也是Visual Studio,但这不太重要.
谢谢!
"但为什么最终他会玩定制的pragma?"
我的源代码由两个编译器解析.在其中一个中,有一个特殊的#pragma,另一个是未知的.当然,我可能会把#ifdef COMPILER_IDENTIFICATION_MACRO ... #endif每个实例都放在一边,#pragma但那会很麻烦.
在C++中编译时,我经常会遇到处理"形式参数"的错误消息,例如
error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned
Run Code Online (Sandbox Code Playgroud)
我确实理解错误,这b是我定义的函数的参数.
但是,参数是正式的是什么意思?还有非正式的参数吗?
我注意到术语"形式参数"也出现在其他语言中,所以我认为它是一个更通用的术语,不一定特定于C族语言?某些语言子集是否支持非正式参数?
看到答案后,最后一个问题:那些名称形式参数和实际参数来自何处?它是源于C标准,还是在某些抽象语言演算中调用它的效果?
在我的程序中的某个时刻,我计算整数除数d.从那时起d,这将是不变的.
稍后在代码中我将除以它d几次 - 执行整数除法,因为值d不是编译时已知常量.
鉴于与其他类型的整数运算相比,整数除法是一个相对较慢的过程,我想优化它.我可以存储一些替代格式d,以便分割过程执行得更快吗?也许是某种形式的倒数?
我不需要d其他任何东西的价值.
值d是任何64位整数,但通常很适合32位.
在C++中,如果要部分地专门化模板类中的单个方法,则必须专门化整个类(例如,在模板专门化中使用带有多个模板参数的模板化类的单个方法中所述)
然而,当具有多个模板参数的较大模板类中,当它们中的每一个影响单个函数时,这变得令人厌烦.使用N个参数,您需要专门化2 ^ N次!
但是,使用C++ 11我认为可能有一个更优雅的解决方案,但我不知道如何处理它.也许不知怎的enable_if?有任何想法吗?
我只使用特定于C++的头文件(例如<cstdlib>),但是我仍然获得全局声明的函数,而不仅仅是std命名空间中的函数.有没有办法,也许是编译器开关,以防止这种情况?
例如,以下代码:
#include <cstdlib>
float random() { return 0.0f; }
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
无法在linux下编译,出现以下错误:
> g++ -c main.cpp main.o
main.cpp: In function ‘float random()’:
main.cpp:2:14: error: new declaration ‘float random()’
/usr/include/stdlib.h:327:17: error: ambiguates old declaration ‘long int random()’
Run Code Online (Sandbox Code Playgroud)
要么
> clang++ main.cpp -o main.o
main.cpp:2:7: error: functions that differ only in their return type cannot be overloaded
float random() { return 0.0f; }
/usr/include/stdlib.h:327:17: note: previous declaration is here
extern long int random …Run Code Online (Sandbox Code Playgroud) boost库是否提供了安全bool习语的实现,以便我可以从中派生我的类?
如果是的话 - 在哪里?
如果不是 - 除了自己实施之外我有什么其他选择?
我发现了以下类似的问题:" 在提升中是否有安全的bool成语助手? "并且接受的答案建议bool_testable<>在Boost.Operators中使用.
不幸的是,当我检查加速手册时,我找不到它.使用它的代码也无法编译.
我还偶然发现了另一个问题" boost :: bool_testable <>是否重新定位或删除了? "并且那里的评论表明bool_testable实际上从未对任何发布版本的提升做出过.
Bjorn Karlsson还有一篇关于这个主题的有趣文章,其中包含一个可以复制粘贴到我的项目中的代码.但我希望,有一个普遍接受和维护的实用程序库(例如boost)已经实现了.
出于兼容性原因,我不想依赖C++ 11.
通过CUDA 5.0编程指南阅读时,我偶然发现了一个名为"漏斗移位"的功能,该功能存在于3.5计算设备中,但不是3.0.它包含注释"参见参考手册",但是当我在手册中搜索"漏斗转换"术语时,我找不到任何内容.
我试着谷歌搜索它,但只在http://www.cudahandbook.com上找到了提及,在第8章:
8.2.3漏斗转换(SM 3.5)
GK110添加了一个64位"漏斗移位"指令,可以通过以下内在函数访问:
__funnelshift_lc():返回左漏斗移位的最重要的32位.
__funnelshift_rc():返回右漏斗移位的最低有效32位.
这些内在函数在sm_35_intrinsics.h中实现为内联设备函数(使用内联PTX汇编程序).
......但它仍然没有解释"左漏斗转移"或"正确的漏斗转移"是什么.
那么,它是什么,需要它在哪里?
我需要一个输入文件流,它有一个双向迭代器/适配器.
不幸的是std::ifstream(和类似的)只能用于std::istream_iterator一种不能倒退的前向迭代器.(或者我错了?)
我可以简单地将整个文件加载到内存中,然后在数组上使用更强大的随机访问迭代器; 但是我想避免这种情况,并且只阅读我真正需要的内容.可能会发生我真的只需要文件的一小部分.
我可以用某种方式手动使用C stdio.h函数,但这将是痛苦的.我基本上需要手动实现一个双向迭代器,并考虑所有规范.
我正在考虑调查增强iostream库,但手册有点压倒性,我希望有人可以帮我实现这一特定目标?或者也许还有另一个已经存在的库可以完全满足我的需求?
我需要boost xpressive库的迭代器来解析我的文件,它希望迭代器可以递增和递减.如果我正在阅读的文件被缓冲,我会没事的,尽管这不是必需的.
有任何想法吗?谢谢!
有没有办法告诉clang展开特定的循环?
谷歌搜索答案给了我命令行选项,这将影响整个compilant而不是一个循环.
对GCC有一个类似的问题--- 告诉gcc专门展开一个循环 ---但是那里提供的答案与clang无关.
选项1建议:
#pragma GCC optimize ("unroll-loops")
Run Code Online (Sandbox Code Playgroud)
好像被默默地忽略了.事实上
#pragma GCC akjhdfkjahsdkjfhskdfhd
Run Code Online (Sandbox Code Playgroud)
也默默地被忽略了.
选项2:
__attribute__((optimize("unroll-loops")))
Run Code Online (Sandbox Code Playgroud)
导致警告:
warning: unknown attribute 'optimize' ignored [-Wattributes]
Run Code Online (Sandbox Code Playgroud)
更新
joshuanapoli提供了一个很好的解决方案,如何通过模板元编程和C++ 11进行迭代,而无需创建循环.该构造将在编译时解析,从而产生重复内联的主体.虽然这不是问题的答案,但它基本上实现了同样的目的.
这就是我接受答案的原因.但是,如果您碰巧知道如何使用标准C循环(for,while)并强制展开它 - 请与我们分享知识!
考虑一个C可向前迭代的STL容器.我需要从每个step元素开始访问idx.如果C是向量(即具有随机访问迭代器),我可以使用索引算法:
template <class Container>
void go(const Container& C) {
for(size_t i = idx; i<C.size(); i+=step) {
/* do something with C[i] */
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果C不支持,例如C是列表,则需要重写上述解决方案.快速尝试将是:
template <class Container>
void go(const Container& C) {
size_t max = C.size();
size_t i = idx;
for(auto it = std::next(C.begin(),idx); i < max; i+=step, it+=step) {
/* do something with *it */
}
}
Run Code Online (Sandbox Code Playgroud)
不会太长,它的工作原理......除了很可能它会触发未定义的行为.双方std::next并it+=step有可能步的方式超越了C.end()之前i < …