标签: c-preprocessor

是在编译时还是在运行时评估常量C表达式?

如果我编写一个使用其他预处理器常量执行操作的#define,那么每次宏在运行时出现时计算的最终值是多少?这取决于编译器中的优化,还是属于标准?

例:

#define EXTERNAL_CLOCK_FREQUENCY    32768
#define TIMER_1_S                   EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS                TIMERB_1_S / 10
Run Code Online (Sandbox Code Playgroud)

将操作十分之三万二千七百六十八每次都发生在运行时我用的是TIMER_100_MS宏?

我想避免以下情况:

#define EXTERNAL_CLOCK_FREQUENCY    32768
#define TIMER_1_S                   EXTERNAL_CLOCK_FREQUENCY
#define TIMER_100_MS                3276
Run Code Online (Sandbox Code Playgroud)

摘要

编译器需要能够计算常量积分表达式,因为它们是在编译时计算数组大小等内容所必需的.但是,标准只说他们"可以" - 而不是"必须" - 这样做.因此,只有脑死亡编译器不会在编译时评估常量积分表达式,但是对非常规编译器的汇编输出的简单检查将验证每种情况.

c compiler-construction optimization standards c-preprocessor

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

为什么这个C或C++宏没有被预处理器扩展?

当用gcc 4.1.0编译时,有人能指出代码中的问题.

#define X 10
int main()
{
  double a = 1e-X;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:指数没有数字.

当我用10替换X时,它工作正常.我还用g ++ -E命令检查了应用了预处理器的文件,它没有用10替换X.我的印象是预处理器用替换文本替换文件中定义的每个宏并应用任何智能.我错了吗?

我知道这是一个非常愚蠢的问题,但我很困惑,我宁愿愚蠢而不是困惑:).

有什么意见/建议吗?

c c++ macros c-preprocessor

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

C++ FAQ的不安全宏的解释?

根据C++ FAQ,宏是邪恶的:

[9.5]为什么我应该使用内联函数而不是普通的旧#define宏?

因为#define宏在四种不同的方面是邪恶的:邪恶的#1,邪恶的#2,邪恶的#3和邪恶的#4.有时你应该使用它们,但它们仍然是邪恶的.与#define宏不同,内联函数避免了臭名昭着的宏错误,因为内联函数总是只评估每个参数一次.换句话说,调用内联函数在语义上就像调用常规函数一样,只是更快:

// A macro that returns the absolute value of i
#define unsafe(i)  \
        ( (i) >= 0 ? (i) : -(i) )

// An inline function that returns the absolute value of i
inline
int safe(int i)
{
  return i >= 0 ? i : -i;
}

int f();

void userCode(int x)
{
  int ans;

  ans = unsafe(x++);   // Error! x is incremented twice
  ans = unsafe(f());   // Danger! f() is …
Run Code Online (Sandbox Code Playgroud)

c c++ c-preprocessor

31
推荐指数
3
解决办法
3666
查看次数

C宏来创建字符串

替代标题(以帮助搜索)

  • 将预处理程序标记转换为字符串
  • 如何从C宏的值创建一个char字符串?

原始问题

我想在编译时使用C #define来构建文字字符串.

该字符串是为调试,发布等而更改的域.

我想要一些这样的事情:

#ifdef __TESTING
    #define IV_DOMAIN domain.org            //in house testing
#elif __LIVE_TESTING
    #define IV_DOMAIN test.domain.com       //live testing servers
#else
    #define IV_DOMAIN domain.com            //production
#endif

// Sub-Domain
#define IV_SECURE "secure.IV_DOMAIN"             //secure.domain.org etc
#define IV_MOBILE "m.IV_DOMAIN"
Run Code Online (Sandbox Code Playgroud)

但预处理器不评估""内的任何内容

  1. 有没有解决的办法?
  2. 这甚至是个好主意吗?

c macros stringification c-preprocessor

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

在C预处理器中strlen?

是否可以strlen()C预处理器中实现?

鉴于:

#define MYSTRING "bob"
Run Code Online (Sandbox Code Playgroud)

是否有一些预处理器宏,X让我说:

#define MYSTRING_LEN X(MYSTRING)
Run Code Online (Sandbox Code Playgroud)

c strlen c-preprocessor

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

Objective-C是否支持#elifdef?

我似乎无法#elifdef在我的iOS项目中工作.如果我这样做:

#ifdef X
const Foo bar[] = { ... };
#else
const Foo bar[] = { ,,, };
#endif
Run Code Online (Sandbox Code Playgroud)

然后顶部的一个(在X下面)突出显示而底部的一个没有突出显示.如果我这样做:

#ifdef W
const Foo bar[] = { ;;; };
#elifdef X
const Foo bar[] = { ... };
#else
const Foo bar[] = { ,,, };
#endif
Run Code Online (Sandbox Code Playgroud)

然后底部的一个(在其他地方)被突出显示而前两个没有.为什么?还有另一种方法我应该这样做吗?我有三个目标,他们都使用相同的m文件.但是,每个目标的常量有点不同,所以我将它们分开.

objective-c c-preprocessor

30
推荐指数
1
解决办法
3万
查看次数

#if 0 vs #if(1> 1)?任何线索

我正在使用遗留代码并发现:

#if (1 > 1)
//define some function
#endif
Run Code Online (Sandbox Code Playgroud)

不确定,这可能与更典型的任何不同#if 0,注释掉代码?有什么想法吗?

c c-preprocessor preprocessor-directive

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

在不知道宏的数量的情况下打印宏值

我的代码包含一个生成的文件(我事先不知道它的内容),只有一个约定我和我的用户就如何创建这个文件达成一致,所以我可以使用它.这个文件看起来像

#define MACRO0 "A"
#define MACRO1 "B"
#define MACRO2 "C"
...
Run Code Online (Sandbox Code Playgroud)

我想打印所有宏值.我目前的代码看起来像

#ifdef MACRO0
std::cout << "MACRO0 " << MACRO0 << std::endl;
#endif
#ifdef MACRO1
std::cout << "MACRO1 " << MACRO1 << std::endl;
#endif
#ifdef MACRO2
std::cout << "MACRO2 " << MACRO2 << std::endl;
#endif
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何迭代生成的文件中的宏,所以我不需要复制我的代码

c++ c-preprocessor

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

宏中的#和##

  #include <stdio.h>
  #define f(a,b) a##b
  #define g(a)   #a
  #define h(a) g(a)

  int main()
  {
    printf("%s\n",h(f(1,2)));
    printf("%s\n",g(f(1,2)));
    return 0;
  }
Run Code Online (Sandbox Code Playgroud)

只需通过查看程序,"可能"期望输出,对于两个printf语句都是相同的.但是在运行程序时,你得到它:

bash$ ./a.out
12
f(1,2)
bash$
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

c stringification c-preprocessor

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

如何让预处理器为__LINE__关键字生成一个字符串?

__FILE__由C++预处理器替换为"MyFile.cpp".我想__LINE__用"256"字符串替换而不是256整数.不使用我自己的书面函数

toString(__LINE__);
Run Code Online (Sandbox Code Playgroud)

那可能吗?我该怎么做?

VS 2008

编辑我想自动查找和替换所有throw;语句

throw std::runtime_error(std::string("exception at ") + __FILE__ + " "+__LINE__);
Run Code Online (Sandbox Code Playgroud)

在我的消息来源.如果我使用宏或函数转换__LINE__为字符串,我将需要手动修改每个源文件.

c++ visual-studio-2008 c-preprocessor

29
推荐指数
2
解决办法
9081
查看次数