标签: predefined-macro

如何使用__DATE__和__TIME__预定义的宏作为两个整数,然后stringify?

想要使用__ DATE __和__ TIME __作为整数,以便在编译时为我的代码提供自动化版本.

#define STRINGIZER(arg)     #arg
#define STR_VALUE(arg)      STRINGIZER(arg)

#define DATE_as_int_str useD(__DATE__) // What can be done ?
#define TIME_as_int_str useT(__TIME__) // What can be done ?

#define VERSION 1.4

#define COMPLETE_VERSION STR_VALUE(VERSION) "." DATE_as_int_str "." TIME_as_int_str
Run Code Online (Sandbox Code Playgroud)

并获得COMPLETE_VERSION一个字符串const unsigned char [].

const unsigned char completeVersion[] = ?? COMPLETE_VERSION;
Run Code Online (Sandbox Code Playgroud)

应输出1.4.1432.2234的东西.

其中一个可能的解决方案可能是但不起作用:convert - date -to-unsigned-int

在编译时的上下文中,convertint-date-and-time-string-to-just-integers-in-c 可以参考expand-and-stringification-how-to-get-the-marco-name-not-its-value

c macros predefined-macro

37
推荐指数
5
解决办法
9万
查看次数

如何使用#pragma message()以便消息指向文件(lineno)?

为了将"todo"项添加到我的代码中,我想在编译器输出中添加一条消息.
我希望它看起来像这样:

c:/temp/main.cpp(104): TODO - add code to implement this
Run Code Online (Sandbox Code Playgroud)

为了利用Visual Studio构建输出功能,通过双击导航到相应的行.

__LINE__宏似乎扩展到了一个int不允许写作的

#pragma message( __FILE__ "("__LINE__"): ..." )
Run Code Online (Sandbox Code Playgroud)

会有另一种方式吗?

c++ pragma visual-studio-2010 line-numbers predefined-macro

32
推荐指数
3
解决办法
4万
查看次数

在编译时检测ICC与GCC

如果我使用gcc或icc,如何在编译时检测?

(我很困惑地发现icc定义__GNUC__- 甚至__GNUC_MINOR____GNUC_PATCHLEVEL__!为什么?)

c c++ gcc icc predefined-macro

16
推荐指数
2
解决办法
5930
查看次数

这是什么#ifdef __GNUC__?

我在libmagic代码中找到了这些行,(sourceforge.net/projects/libmagic/files/latest/download).他们的意思是什么?什么是python等价物?

#ifdef __GNUC__
__attribute__((unused))
#endif 
Run Code Online (Sandbox Code Playgroud)

什么__GNUC__意思? 所以它似乎检查是否安装了GCC编译器,是什么意思__CC_ARM,__ ICCARM __,__ GNUC __,_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

什么是__attribute__((unused)) 这里有一段代码片段,但没有解释:我如何最好地消除有关未使用变量的警告?

是什么样的区别__GNUC__,并_MSC_VER 有一定的解释上_MSC_VER,但它是什么一回事呢?如何检测我是否使用Visual Studio 2008编译代码?

最后一个问题:我怎样才能#ifdef检查操作系统是否正在使用GNU和MS可视化工作室编译我的python代码?

c gcc visual-studio predefined-macro

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

是否可以保证__LINE__指令的一致性?

GCC 9最近__LINE__在某些情况下更改了指令的行为。下面的程序说明了此更改:

#include <stdio.h>
#define expand() __LINE__
int main() {
  printf("%d\n",expand(
                ));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于宏expand()(扩展为__LINE__)跨越多行,因此GCC最多8.3(而Clang最多8.0)考虑了扩展的最后一行的编号print 5。但是,GCC 9会考虑第一行并打印4。

(Godbolt链接:https://godbolt.org/z/3Nk2al )

C11标准关于的确切行为不是很精确__LINE__,除了:

6.10.8预定义的宏名称

在以下子节中列出的预定义宏的值(__FILE__和除外__LINE__)在整个转换单元中保持不变。

(...)

6.8.10.1强制宏

以下宏名称应由实现定义:

(...)

__LINE__ 当前源行的假定行号(在当前源文件中)(整数常量)。

我认为这意味着确切的值是实现定义的,因此不能期望其值在不同的编译器版本或不同的编译器中保持不变。还是在标准的其他地方对这种效果有一些争论?

例如,可以说只要源本身没有变化,当前源行假定行号就应该稳定吗?

c language-lawyer predefined-macro c-preprocessor

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

如何写一个'clamp'/'clip'/'bound'宏来返回给定范围内的值?

我经常发现自己写的东西

int computedValue = ...;
return MAX(0, MIN(5, computedValue));
Run Code Online (Sandbox Code Playgroud)

我希望能够将其写为单个单行宏.它必须没有副作用,就像现有的系统宏MIN和MAX一样,并且应该适用于与MIN和MAX相同的数据类型.

任何人都可以告诉我如何把它变成一个宏吗?

c macros objective-c predefined-macro

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

Swift中的#error(如何标记编译时错误)

什么是传统c风格#error关键字的迅速替代?

当预定义失败时,我需要它来引发编译时错误:

#if CONFIG1
    ...
#elseif CONFIG2
    ...
#else
    #error "CONFIG not defined"
#endif
Run Code Online (Sandbox Code Playgroud)

configuration compiler-errors predefined-macro swift

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

如何在Code :: Blocks中设置预定义的宏

有没有办法为我本地安装的Code :: Blocks设置一些预定义的宏.

要详细说明,基本上我想在pc上编译某些块,而不是我发送代码的任何地方.实现此目的的一种方法如下:

#define MYPC
#ifdef MYPC
 //do something
#else
 // do something else
#endif
Run Code Online (Sandbox Code Playgroud)

我想要实现同样的目标,但我不想包含#define MYPC这一行,并且想在IDE中添加它.我知道如何在Visual Studio中执行此操作,我认为它也存在于Code :: Blocks中.谢谢.

c++ g++ codeblocks predefined-macro

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

C++在编译时将月份作为数字

我有一个c ++项目,必须打印修订字符串.修订字符串是公司明智的,协议包括构建时间为yyyy/mm/dd.

我用它从构建系统中将其指定为宏,但这不再是一个选项,因为会混淆预编译的头文件(在日期更改时的增量构建中).

我想从编译器获得的生成日期,但要实现这个__DATE__,并__TIMESTAMP__给予一个月嗯.

有什么想法,我怎么能把月份作为数字?


根据下面的答案我完成的版本是:

#define __MONTH__ (\
  __DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? "01" : "06") \
: __DATE__ [2] == 'b' ? "02" \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? "03" : "04") \
: __DATE__ [2] == 'y' ? "05" \
: __DATE__ [2] == 'l' ? "07" \
: __DATE__ [2] == 'g' ? "08" \
: __DATE__ [2] == 'p' ? …
Run Code Online (Sandbox Code Playgroud)

c++ predefined-macro

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

检查编译器是否为 Turbo C++

我目前正在处理为Turbo C++设计的遗留代码。为了解决 Turbo C++ 缺乏bool数据类型的问题,该程序包含以下代码行。

// Necessary when compiling with Turbo C++
enum bool {false, true};
Run Code Online (Sandbox Code Playgroud)

大多数 C++ 编译器无法运行带有error: expected identifier before 'bool'. 虽然我很想切换到更新的编译器,但不幸的是,我需要维护此解决方法以实现向后兼容性。

我如何指示该特定代码行只能在 Turbo C++ 中编译?

c++ turbo-c++ predefined-macro

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