小编Lef*_*ris的帖子

C预处理器测试多个宏的定义

我搜索了网站,但没有找到我正在寻找的答案,所以这里是一个非常快速的问题.

我想做那样的事情:

#ifdef _WIN32 || _WIN64
     #include <conio.h>
#endif
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我知道_WIN32是为32位和64位窗口定义的,所以我可以用于Windows检测.我更感兴趣的是我是否可以使用预处理程序指令这样的逻辑运算符,如果是,如何,因为上述方法不起作用.

用gcc编译我得到:

警告:#ifdef指令结束时的额外令牌,它基本上只需要第一个MACRO并忽略其余的.

c logical-operators c-preprocessor preprocessor-directive

43
推荐指数
2
解决办法
2万
查看次数

Windows 64x下的GCC中的printf和%llx

我试图摆脱我的程序中的虚假警告.在Windows 64下(在linux下没有这样的警告)这句话:

printf("%llu",UINT64_MAX);
Run Code Online (Sandbox Code Playgroud)

生成以下警告:

warning: unknown conversion type character 'l' in format [-Wformat]|
Run Code Online (Sandbox Code Playgroud)

输出似乎是正确的,警告不应该在那里.我能找到的最相关的gcc相关帖子是2008年的这个错误报告http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37768

如果我根据这一点正确理解,这个警告源于这样一个事实:在引擎盖下gcc调用MSVC printf,它不符合C99并且无法理解printf中的unsigned long long格式.在同一页面上,建议的解决方案是使用名为gnu_printf的东西.我试图谷歌,但我没有找到包含的标题.

所以问题是如何处理以便携带?我只想以正确和非邋way的方式摆脱警告.

c gcc

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

在ntdll内部使用gdb进行调试时,断点无处不在

我做了一个非常简单的程序,它为我自动化了一些东西.我用c ++编写它,它在Windows上运行.在Codeblocks IDE内部使用GDB进行调试时,我无处可获得许多断点.我不知道可能导致这个问题的原因.断点似乎与内存问题有关...因为当我修复了我检测到的内存泄漏时,断点数量明显减少了.

gdb告诉我的确切事情是:

 Program received signal SIGTRAP, Trace/breakpoint trap.
 In ntdll!TpWaitForAlpcCompletion () (C:\Windows\system32\ntdll.dll)
Run Code Online (Sandbox Code Playgroud)

我在程序中多次得到这个.我认为我可能会做一些非常错误的事情,即使程序看起来运行得很好并且它完成了我想要它做的事情.任何人都可以告诉我这是什么问题,因为我不知道在哪里看?如果它不是问题,那么有没有人知道如何禁用它,因为这阻止我进入我自己设置的断点?

提前致谢!

编辑:(添加GDB的输出where命令):我在哪里可以检查每个函数的作用,所以我可以看到我做错了什么?

#0  0x76fefadd in ntdll!TpWaitForAlpcCompletion () from C:\Windows\system32\ntdll.dll
#1  0x0028e894 in ?? ()
#2  0x76fb272c in ntdll!RtlCreateUserStack () from C:\Windows\system32\ntdll.dll
#3  0x00657fb8 in ?? ()
#4  0x00657fb8 in ?? ()
#5  0x76f4b76a in ntdll!RtlDowncaseUnicodeChar () from C:\Windows\system32\ntdll.dll
#6  0x02070005 in ?? ()
#7  0x00000b10 in ?? ()
#8  0x0028e8dc in ?? ()
#9  0x76ff0b37 in ntdll!TpQueryPoolStackInformation () from C:\Windows\system32\ntdll.dll
#10 0x038b0000 in ?? () …
Run Code Online (Sandbox Code Playgroud)

debugging gdb

10
推荐指数
2
解决办法
2万
查看次数

交叉编译器C中的二进制兼容性

我需要验证一些我怀疑的东西.如果共享库(.dll)是用C语言编写的,则使用C99标准并在编译器下编译.说MinGw.然后根据我的经验,它是二进制兼容的,因此可以从任何其他编译器使用.说MS Visual Studio.我根据自己的经验说,因为我不止一次成功地尝试过它.但我需要验证这是否是一个规则.

另外我想问一下它是否确实如此,那么为什么完全用C语言编写的库,例如openCV,不为每个不同的操作系统提供编译的二进制文件?我知道明显的原因是设置所有的编译时参数,但除此之外没有正确的吗?

编辑:我正在添加一个额外的问题,我认为这是原始的逻辑扩展.这不是一个如何去创建一个封闭的源库吗?由于提供源的选项不在窗口中,因此给出二进制文件是唯一的选择.在这种情况下,为尽可能多的体系结构提供二进制文件是理想的结果,C是在系统和编译器之间具有最佳可移植性的明显选择.对?

c shared-libraries binary-compatibility

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

clang-format BinPackArguments没有按预期工作

clang-format有2个叫做BinPackParameters和的 选项BinPackArguments.它们似乎控制着函数声明和函数调用的缩进方式.

BinPackParameters似乎提供了函数声明的预期结果,但BinPackArguments似乎没有像函数调用那样工作.

这是一个简单的测试文件:

#include <stdbool.h>

void function_with_a_huge_name_that_should_just_not_be(unsigned int a, char *b, unsigned int c, unsigned int d, unsigned int e)
{
    return;
}

int main()
{
    function_with_a_huge_name_that_should_just_not_be(13, "bb", 1234234, 4324324, 2355345);
}
Run Code Online (Sandbox Code Playgroud)

这就是它的格式:

#include <stdbool.h>

void function_with_a_huge_name_that_should_just_not_be(unsigned int a,
    char *b,
    unsigned int c,
    unsigned int d,
    unsigned int e)
{
    return;
}

int main()
{
    function_with_a_huge_name_that_should_just_not_be(
        13, "bb", 1234234, 4324324, 2355345);
}
Run Code Online (Sandbox Code Playgroud)

我的.clang-format文件如下:

---
AccessModifierOffset: -2
AlignAfterOpenBracket: false
AlignEscapedNewlinesLeft: …
Run Code Online (Sandbox Code Playgroud)

clang clang-format

9
推荐指数
2
解决办法
3089
查看次数

用于处理c ++中的堆栈损坏的工具

编辑:由于评论是关于我的例子我删除它并将其转换为一般问题:

有些时候,在我的项目中,我遇到了堆栈损坏.无论我多么努力编写代码来避免它,有时候这是不可避免的.但是当它发生时,有什么方法可以对抗呢?

我在这个博客中发现了一个好人给出的一个宏:http://rxwen.blogspot.com/2009/04/detect-stack-corruption.html,它读取ebp寄存器值以检测损坏.

但是必然会有更复杂的工具来帮助你不要徒步射击自己.我使用Codeblocks和gcc编译器在Windows中编程.我提出这个问题的原因是找到我可以在我的编程环境下使用的工具来帮助我检测这些错误并纠正它们.有什么建议?

感谢您的任何答案,并花时间阅读我的问题.

c++ stack corruption

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

用Unicode写入文件

我在我的c程序中写入unicode文件时遇到了一些问题.我正在尝试将unicode日语字符串写入文件.当我去检查文件虽然它是空的.如果我尝试非unicode字符串,它可以正常工作.我究竟做错了什么?

setlocale(LC_CTYPE, "");
FILE* f;
f = _wfopen(COMMON_FILE_PATH,L"w");
fwprintf(f,L"???");
fclose(f);
Run Code Online (Sandbox Code Playgroud)

关于我的系统哦:我正在运行Windows.我的IDE是Visual Studio 2008.

c unicode

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

将字符与十六进制值进行比较

在最后一天,我的代码中有一个讨厌的错误,经过一些搜索似乎与char值和hex之间的比较有关.我的编译器是在Windows上运行的gcc 4.4.1.我在下面的简单代码中复制了这个问题:

char c1 = 0xFF; char c2 = 0xFE;
if(c1 == 0xFF && c2 == 0xFE)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,上面的代码没有进入循环.我完全不知道为什么,并且真的很感激一些帮助.这是荒谬的,解决方案必须(一如既往)是我完全忽视的一个巨大错误.

如果我用无符号字符替换上面的字符,它可以工作,但仅限于某些情况.我正在努力找出发生了什么.另外,如果我将十六进制值转换为char,它会正确地进入循环,如下所示:

if(c1 == (char)0xFF && c2 == (char)0xFE)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

那是什么意思?它为什么会发生?原始十六进制值是否默认解释为char?对于我的代码中的好奇点,我首先注意到它是一个流的前2个字节与上面的十六进制值的比较,以及它们与字节顺序标记的相反.

任何帮助表示赞赏

c hex

6
推荐指数
2
解决办法
2万
查看次数

初始化C结构时的术语

这将是一个简单的问题,但谷歌搜索似乎并没有给我一个答案.我在C中理解它的方式我们有两种方法来初始化foo对象,当foo是一个结构时.请查看下面的代码示例

typedef struct foo
{
   int var1;
   int var2;
   char* var3;
}foo;

//initializes and allocates a foo
foo* foo_init1(int v1,int v2,const char* v3)
{
   if(..some checks..)
      return 0;
   foo* ret = malloc(sizeof(foo));

   ret->var1 = v1;
   ret->var2 = v2;
   ret-var3 = malloc(strlen(v3)+1);
   strcpy(ret->var3,v3);

   return ret;
}

// initializes foo by ... what? How do we call this method of initialization?
char foo_init2(foo* ret,int v1,int v2, const char* v3)
{
   //do some checks and return false
    if(...some checks..)
         return false//;assume you defined …
Run Code Online (Sandbox Code Playgroud)

c terminology initialization

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

语义,cedet如何强制解析源文件

我在我的emacs c/c ++开发设置中一直在尝试使用cedet和semantic,除了一个小细节之外我对它非常满意.

ede-cpp-root-project用来创建一个项目,并给出我的项目的根目录以及包含文件所在的目录,如下所示:

(ede-cpp-root-project "My Project"
                :name "My Project"
                :file "/path/to/rootdir/AFILE"
                :include-path '( 
                "/include2"
                "/include1"
                               )

                )
Run Code Online (Sandbox Code Playgroud)

这使我可以轻松跳转到函数的声明,semantic-ia-fast-jump但它不会让我接受这些函数的定义.因此它似乎只处理头文件并完全忽略源文件.即使我继续声明该函数并触发semantic-analyze-proto-impl-toggle它,它也会告诉我没有找到合适的实现.

如果我手动打开函数实现所在的源文件,那么它只能通过语义进行解析,并且所有上述函数都能正常工作.

所以我的问题是,如果没有手动打开项目根目录下包含的所有源文件,或者ede-cpp-root-project通过:spp-files参数手动包含它们,还有其他方法可以强制解析目录下的所有源文件吗?

谢谢!

c c++ emacs cedet

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