2013-05-09 62 views
0

我有一個printf的小問題,我不知道爲什麼!C++:命名空間和printf vs cout中的extern變量

=> kernel.h當

#ifndef KERNEL_H 
#define KERNEL_H 

namespace kernel 
{ 
    extern const double h; 
} 

#endif // KERNEL_H 

=> kernel.cpp

#include <kernel.h> 

namespace kernel 
{ 
    const double kernel::h=85.0; 
} 

=> main.cpp中

#include "kernel.h" 
#include <iostream> 
//#include <cstdio>//With cstdio, it is the same problem ! 

int main(int argc, char *argv[]) 
{ 

    using namespace kernel; 

    double a = h; 

    printf("printf a is %d\n",a); 
    std::cout<<"std::cout a is " << a << std::endl; 

    printf("printf h is %d\n",h); 
    printf("printf kernel::h is %d\n",kernel::h); 
    std::cout << "std::cout h is " << h << std::endl; 

    return 0; 
} 

我的我的控制檯輸出:

printf a is 0 
std::cout a is 85 
printf h is 0 
printf kernel::h is 0 
std::cout h is 85 

爲什麼printf不起作用?因爲它是一個C函數?

感謝

+0

是否真的必要在kernel.cpp kernel.h當? – BillyJean 2013-05-09 17:11:33

+0

這不是一個錯誤,但cpp文件中的定義過多。你可以做'const double kernel :: h = 85.0'(不用重新打開命名空間),或者如果你重新打開它,只需要'const double h = 85.0'。你有點「做了兩個」,這是多餘的。 – AnT 2013-05-09 17:11:36

回答

2

這是因爲您正在將其打印爲integer。 嘗試%lg%lf

printf("printf kernel::h is %lg\n",kernel::h); 

如果打開警告編譯器會告訴你這個問題。 -Wformat

或者只是使用std::cout,你不會有這樣的問題

std::cout << kernel::h; 
2

%d是整數,你要打印一個double作爲int。我想你想%lflong float雙打?從來沒有真正打印過雙倍之前。

+0

好吧,我的壞!我真的很蠢!它與%f正常工作,你是正確的%d,它只是爲int ...非常感謝 – user2367163 2013-05-09 17:07:43

+0

@ user2367163 :) – RandyGaul 2013-05-09 17:09:56